在计算机等级考试二级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: %dn",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%un",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 <stdio.h>

int fun(int number)

{

}

int main()

{

   int n;

   printf("Please enter a number:");

   scanf("%d",&n);

   printf("n%dn",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  <stdio.h>

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: %un",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  <stdio.h>

int fun(int x)

{

}

int main()

{

    int x=-1;

    while(x<0)

    {

        printf("Please input(x>0): "); 

        scanf("%d",&x); 

    }

    printf("nThe result is: %dn",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 <stdio.h>

long fun(long num)

{

}

int main()

   long n;

   printf("Please enter a number:");

   scanf("%ld",&n);

   printf("n%ldn",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  <stdio.h>

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: %ldn",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 <stdio.h>

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: %ldn", 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  <stdio.h>

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: %ldn",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 <stdio.h>

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("  YESn") ;

    else       printf("  NOn") ;

    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 <stdio.h>

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=%dn",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 <stdio.h>

unsigned  fun(unsigned  w)

{

}

int main()

{

    unsigned  x;

    printf("Enter a unsigned integer number :" );

    scanf("%u", &x );

    printf("The original data is :  %un", x);

    if (x < 10) printf ("Data error !");

    else  printf("The result : %un", 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  <stdio.h>

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;
    }
}
参考程序
内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/cs-whut/p/16886373.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!

相关课程