在计算机等级考试二级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 <stdio.h>
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 <stdio.h>
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