在计算机等级考试二级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;    }}

参考程序