老师讲,这是个hin重要的C语言习题
题目:给出一个整数,要求:
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;
}
好啦,这个题就到此结束了,多练习!多练习!多练习!
加油!自己以及各位码农!