在计算机等级考试二级C语言程序设计试题中,有关一个正整数各位数字的处理是一个重要的考点,这类试题在历年考试试卷的程序填空题和程序设计题中经常出现。
一.实例解析
例1 编写函数fun,它的功能是:找出100~x(x<=999)之间所有整数中各位上数字之和为15的整数,然后输出;符合条件的整数个数作为函数值返回。
例如,若x=500时,100~500之间各位上数字之和为15的整数有:159、168、177、186、195、249、258、267、276、285、294、339、348、357、366、375、384、393、429、438、447、456、465、474、483、492。共有26个。
#include
int fun(int x)
{
}
int main()
{
int x=-1;
while(x>999||x<0)
{
printf(“Please input(0<x<=999): ");
scanf(“%d”,&x);
}
printf(“\nThe result is: %d\n”,fun(x));
return 0;
}
解析:由于程序中给定的整数t是一个3位数,因此可以用s3、s2和s1三个变量分别保存给定整数t的百位数字、十位数字和个位数字,显然
s3=t/100; s2=t/10%10; s1=t%10;
用一重循环对100~x之间的所有整数t进行穷举,若各位数字之和s1+s2+s3等于15,则输出t并计数。
编写的fun函数如下:
int fun(int x)
{
int n, s1, s2, s3, t;
n=0;
t=100;
while (t<= x)
{
s1=t%10; s2=(t/10)%10; s3=t/100;
if(s1+s2+s3==15)
{
printf(“%d “,t);
n++;
}
t++;
}
return n;
}
例2 编写函数fun,它的功能是:计算无符号整数num的各位上的数字之和。
例如,若输入250,则输出应为7;若输入123456,则输出应为21。
#include
unsigned fun(unsigned num)
{
}
int main()
{
unsigned n;
printf(“Please enter a number:”);
scanf(“%ud”,&n);
printf(“\n%u\n”,fun(n));
return 0;
}
解析:由于题目未给定整数num的位数,因此像例1那样采用多个变量分别保存num的各位数字,并通过对num进行算术运算得到各位上的数字的方法不适用。
实际上,对于任意一个非负整数num,num%10可以得到num的个位数,num=num/10会将num的个位数丢掉,这样,通过循环不断求得num的个位数并丢掉个位数,可以将num各位上的数字依次分离出来,其操作步骤为:
1)分离出num的个位数,即num%10。
2)将num除以10,作为新的num,即新的num丢掉了个位数。
3)如果num等于0,分离完毕,结束。否则,转第1)步,继续分离各位数字。
例如,num=1234,num%10=4,num=1234/10=123,得到数字4;
num%10=3,num=123/10=12,得到数字3;
num%10=2,num=12/10=1,得到数字2;
num%10=1,num=1/10=0,得到数字1;结束。
将每次分离出的个位数累加起来,就得到num的各位数字之和。
编写的fun函数如下:
unsigned fun(unsigned num)
{
unsigned s=0;
do
{
s+=num%10;
num/=10;
} while(num);
return s;
}
例3 编写函数fun,它的功能是:求整数number的逆序数。
例如,若输入12345,则输出应为54321;若输入-1240,则输出应为-421。
#include
int fun(int number)
{
}
int main()
{
int n;
printf(“Please enter a number:”);
scanf(“%d”,&n);
printf(“\n%d\n”,fun(n));
return 0;
}
解析:由于number可能为负数,置符号t初值为1(表示正数),若number为负数,则置符号t=-1,且number=-number。这样将number都作为无符号整数处理。
按例2的方法分离出number的各位数字,例如,若number=1234,则依次分离出数字4、3、2和1,如何将数字4、3、2、1合并成整数4321呢?
由于 4321=4*1000+3*100+2*10+1
= (((0*10 + 4)*10 + 3)*10 + 2)*10 + 1
因此可设s的初始值为0,每分离一个数字d后,加到s的后面,即s=s*10+d,可得number的逆序数s。
编写的fun函数如下:
int fun(int number)
{
int t=1,s;
s=0;
if (number<0)
{
t=-1;
number=-number;
}
while (number!=0)
{
s=s*10+number%10;
number/=10;
}
return t*s;
}
例4 编写函数fun,它的功能是:将无符号整数n中各位上为奇数的数去除,剩下的数按原来从高位到低位的顺序组成一个新的数,并通过函数值返回。
例如,输入一个数:27835496,新的数为:2846。
#include
unsigned int fun(unsigned int n)
{
}
int main()
{
unsigned n=-1;
while(n>99999999||n<0)
{
printf(“Please input(0<n<100000000): ");
scanf(“%ud”,&n);
}
printf(“\nThe result is: %u\n”,fun(n));
return 0;
}
解析:同样按例2的方法分离出无符号整数n的各位数字,例如,若n=27835496,则依次分离出数字6,9,4,5,3,8,7,2,去掉奇数后,剩下的数字为6,4,8,2,如何将数字6、4、8、2合并成整数2846呢?
由于 2846=2 * 1000 + 8 * 100 + 4 * 10 + 6 * 1,
=2 * 10*10*10*1 + 8 * 10*10*1 + 4 * 10*1 + 6 * 1
因此可设s的初始值为0,i初始值为1,每分离一个数字d后,执行s=d*i+s和 i=i*10,可求得对应结果s。
编写的fun函数如下:
unsigned int fun(unsigned int n)
{
unsigned int x=0, i;
int t;
i=1;
while(n)
{
t=n % 10;
if (t%2==0)
{
x=x+t*i;
i=i*10;
}
n =n /10;
}
return x;
}
二.程序设计题
1.编写函数fun,它的功能是:找出100~999之间(含100和999)所有整数中各位上数字之和为x(x为一正整数)的整数,然后输出;符合条件的整数个数作为函数值返回。
例如,若x=5时,100~999之间各位上数字之和为5的整数有:104、113、122、131、140、203、212、230、302、311、320、401、410、500。共有15个。
#include
int fun(int x)
{
}
int main()
{
int x=-1;
while(x<0)
{
printf(“Please input(x>0): “);
scanf(“%d”,&x);
}
printf(“\nThe result is: %d\n”,fun(x));
return 0;
}
int fun(int x){ int n, s1, s2, s3, t; n=0; t=100; while (t<=999) { s1=t%10; s2=(t/10)%10; s3=t/100; if(s1+s2+s3==x) { printf("%d ",t); n++; } t++; } return n;}
参考程序
2.编写函数fun,它的功能是:计算num的各位上的数字之积。
例如,若输入252,则输出应为20;若输入202,则输出应为0。
#include
long fun(long num)
{
}
int main()
{
long n;
printf(“Please enter a number:”);
scanf(“%ld”,&n);
printf(“\n%ld\n”,fun(n));
return 0;
}
long fun(long num){ long k=1; do { k*=num%10; num/=10; } while(num); return (k);}
参考程序
3.编写函数fun,它的功能是:将形参n中各位上为偶数的数取出,并按原来从高位到低位相反的顺序组成一个新的数,并作为函数值返回。
例如,若n=27638496,得到的新数为:64862。
#include
unsigned long fun(unsigned long n)
{
}
int main()
{
unsigned long n=-1;
while(n>99999999||n<0)
{
printf(“Please input(0<n<100000000): ");
scanf(“%ld”,&n);
}
printf(“\nThe result is: %ld\n”,fun(n));
return 0;
}
unsigned long fun(unsigned long n){ unsigned long x=0; int t; while(n) { t=n%10; if(t%2==0) x= x*10+t; n= n/10; } return x;}
参考程序
4.编写函数fun,其功能是:将长整数s中每一位上为偶数的数依次取出,构成一个新数放在t中,高位仍在高位,低位仍在低位。
例如,s=87653142时,t=8642。
#include
void fun(long s, long *t)
{
}
int main()
{
long s, t;
printf(“\nPlease enter s:”);
scanf(“%ld”, &s);
fun(s, &t);
printf(“The result is: %ld\n”, t);
return 0;
}
void fun(long s, long *t){ int d; long sl=1; *t = 0; while ( s > 0) { d = s%10; if (d%2==0) { *t=d* sl+ *t; sl *= 10; } s /= 10; }}
参考程序
5.编写函数fun,它的功能是:将形参n所指变量中,各位上为偶数的数去除,剩下的数按原来从高位到低位的顺序组成一个新的数,并通过形参指针n传回所指变量。
例如,输入一个数:27638496,新的数为:739。
#include
void fun(unsigned long *n)
{
}
int main()
{
unsigned long n=-1;
while(n>99999999||n<0)
{
printf(“Please input(0<n<100000000): ");
scanf(“%ld”,&n);
}
fun(&n);
printf(“\nThe result is: %ld\n”,n);
return 0;
}
void fun(unsigned long *n){ unsigned long x=0, i; int t; i=1; while(*n) { t=*n % 10; if(t%2!=0) { x=x+t*i; i=i*10; } *n =*n /10; } *n=x;}
参考程序
6.编写函数fun,其功能是:判断无符号整数n是否为回文数。若是,函数返回1,否则返回0。回文数是指顺读和倒读都一样的数。
例如,12321是回文数,而12312就不是回文数。
#include
int fun(unsigned int n)
{
}
int main()
{
unsigned int n=-1;
while(n>99999999||n<0)
{
printf(“Please input(0<n<100000000): ");
scanf(“%ud”,&n);
}
if(fun(n)) printf(” YES\n”) ;
else printf(” NO\n”) ;
return 0;
}
int fun(unsigned int n){ unsigned int t,s=0; t=n; while (t) { s=s*10+t%10; t/=10; } if (s==n) return 1; else return 0;}
参考程序
7.编写函数fun,它的功能是:统计一个无符号整数中各位数字值为零的个数,通过形参传回主函数,并把该整数中各位上最大的数字值作为函数值返回。
例如,若输入无符号整数30800,则数字值为零的个数为3,各位上数字值最大的是8。
#include
int fun(unsigned n, int *zero)
{
}
int main()
{
unsigned n;
int zero,max;
printf(“\nInput n(unsigned): “);
scanf(“%d”,&n);
max = fun( n,&zero );
printf(“\nThe result: max=%d zero=%d\n”,max,zero);
return 0;
}
int fun(unsigned n, int *zero){ int count=0,max=0,t; do { t=n%10; if(t==0) count++; if(max<t) max=t; n=n/10; }while(n); *zero=count; return max;}
参考程序
8.编写函数fun,它的功能是:求出n位整数w(w>10)的后n-1位的数作为函数值返回。
例如,若w值为5923,则函数返回923;w为923,函数返回23。
#include
unsigned fun(unsigned w)
{
}
int main()
{
unsigned x;
printf(“Enter a unsigned integer number :” );
scanf(“%u”, &x );
printf(“The original data is : %u\n”, x);
if (x < 10) printf ("Data error !");
else printf(“The result : %u\n”, fun(x));
return 0;
}
unsigned fun(unsigned w){ unsigned x=0,d,p=1; while (w>=10) { d=w%10; x=p*d+x; p=p*10; w=w/10; } return x;}
参考程序
9.编写函数fun,它的功能是:统计整型变量m中各数字出现的次数,并存放到数组a中,其中,a[0]存放0出现的次数,a[1]存放1出现的次数,……,a[9]存放9出现的次数。
例如,若m为14579233,则输出结果为:0,1,1,2,1,1,0,1,0,1。
#include
void fun( int m, int a[10])
{
}
int main()
{
int m, a[10],i;
printf(“请输入一个整数 : “); scanf(“%d”, &m);
fun(m, a);
for (i=0; i<10; i++) printf("%d,",a[i]);
printf(“\n”);
return 0;
}
void fun( int m, int a[10]){ int i; for (i=0; i<10; i++) a[i] = 0; while (m > 0) { i = m%10; a[i]++; m = m/10; }}
参考程序