老师讲,这是个hin重要的C语言习题

来源:互联网 发布:hp打印机端口是多少 编辑:程序博客网 时间:2024/06/08 19:48

题目:给出一个整数,要求:
1、求出它是几位数;
2、分别输出每一位数字;
3、按逆序输出每一位数字;


# include <stdio.h>
/*对于求位数小编写了三个函数,最后我们根据测试用例对他们的结果进行比较。
要求一个数的位数,采用逐位丢弃数字的方法,丢弃数字的个数即为数字的位数。用数字n整除10,整数除整数还是整数,这样就丢弃了个位数字,位数+1,然后逐位采用此方法丢弃个位数字直至该数为0。*/
int Num(int n)           
{
     int count=0;          //count表示该数的位数
     while(n!=0)           //while语句
    {
       count++;
       n/=10;
    }
    return count;
}

int Num1(int n)
{
    int count;
    for(count=0;n!=0;count++)          //for语句
   {
         n/=10;
   }
   return count;
   }

int Num2(int n)
{
   int count=0;
   do                                     //do-while语句
  {
       count++;
       n/=10;
  }while(n!=0);
  return count;
}
因为按逆序输出数字较为简单所以我们先完成第3小题
按逆序输出的各位数字,只能从个位数字开始打印,首先对该数取余10,打印的余数即为个位数字,再逐位整除10丢掉个位数字。循环进行直至该数为0则结束。
void PrintNixu(int n)
{
     if(n < 0)                        //对于负数,首先打印它的符号
     {
        printf("-");
        n = -n;
      }
    do
    {
      printf("%d",n%10);
      n/=10;
    }while(n!=0);
    printf("\n");
}
/*按顺序输出的各位数字,就要从最高位数字开始打印,我们必须调用之前求位数的子函数Num,得到它的返回值count。然后for循环语句得到n每次需要整除的除数b,首先用n整除b,打印的数即为最高位数字,再逐位整取余,循环进行直至该数为0则结束。*/
void PrintShunxu(int n)
{
    int a=Num2(n);
    int b=1;
    for(int i=1;i<a;i++)
    {
      b*=10;
     }
    do
     {
          printf("%d",n/b);
          n%=b;
          b/=10;
       }while(n!=0);
          printf("\n");
}

int main()
{
       printf("位数为%d\n",Num(0));
       printf("位数为%d\n",Num(123456));
       printf("位数为%d\n",Num1(0));
       printf("位数为%d\n",Num1(1010101010101));
       printf("位数为%d\n",Num2(0));
       printf("位数为%d\n",Num2(789456321));
/*根据这几组测试用例可以看出,for循环和while循坏几乎没有差别,它们均存在一个bug,就是当n=0的时候,位数为0,使用do-while语句则不会出现这个问题。*/
      PrintNixu(-123);
      PrintNixu(12345678);
      PrintShunxu(123456);
      return 0;
}

好啦,这个题就到此结束了,多练习!多练习!多练习!
加油!自己以及各位码农!
原创粉丝点击