例题来源:谭浩强《C语言程序设计》第五版:习题4.9
给出一个不多于5位的正整数,要求①求出它是几位数;②按逆序输出各位数字;③分别输出每一位数字。
我们一下内容前提更加宽泛不要求位数时对数字的处理。
1.求位数:
我们的第一反应是用这个数字去跟0,9;10,99;100;999…去比较,这种方法在规定了不超过五位数字里确实可以使用,但是一旦位数很高就十分麻烦,尤其是还不知道输入的会是几位数。以普通思维去考虑,看到一串数字我们要去确定它是几位数字,那不是很自然去数一下是几个数字就是几位了吗?数一个一位,两个两位以此类推,这时就需要一个计数器来累加我们数过的位数了。
#include<stdio.h>
int GetFigures (int n) //确定函数名,确定参数数字n
{
int i;//定义一个计数器
if(n==0)
return 1;
for(i=0;n!=0;i++)
{
n/=10;//每丢掉一个最后一位则计数器累加1
}
return i;
}
int main()
{
printf("%d\n",GetFigures(123456789));
printf("%d\n",GetFigures(-12348));
printf("%d\n",GetFigures(0));
return 0;
}
1.注意点:
①上面说到我们数一个数字记一个数字,那就从最后一位开始数一位再扔一位。如何扔掉最后一位:n/10
例如:12345/10=1234 1234/10=123…
②关注56行,如果没有特殊提到0(当然这个也是在测试后发现0的位数总是显示为0),还有没有其他处理办法呢?
前面有说到do while和while他们的表达式都是不缺少的区别就在do while是先执行后判断,第一次就为假时,do while就会比while多执行一次;第一次为真时,与while无区别。既然是先执行后判断那我们第一步就希望直接判断0而不是去执行0/10。
核心代码如下:
int GetFigures(int n)
{
int i= 0;
do
{
i++;
n /= 10;
} while (n != 0);
return i;
}
2.逆序输出:
上面说到数位数的时候要从最后一位数一位计数器加一再扔一位以此类推,既然是从最后一位开始的不正是要逆序的第一步,那我们在扔之前把它显示出来不就好了。
#include<stdio.h>
void PrintReverse(int n)
{
if (n < 0)
{
printf("-");
n = -n;
}
if(n==0)
{
printf("0");
}
for(;n!=0;)
{
printf("%d",n%10);//显示最后一位
n/=10;//丢弃最后一位
}
printf("\n");
}
int main()
{
PrintReverse(12345678);
PrintReverse(-123456789);
PrintReverse(0);
return 0;
}
2.注意点:
①注意看如何实现显示位后一位和丢弃最后一位;以及使用for语句时0的特殊性;还有负数的逆序注意点
②用do while实现时,核心代码如下:
void PrintReverse(int n)
{
int i;
if (n < 0)
{
printf("-");
n = -n;
}
do
{
printf("%d ",n%10);
n /= 10;
} while (n != 0);
printf("\n");
}
3.顺序输出
例如数字12345,首先要输出它的第一位“1”如何能够得到,就想到C语言中的/除,12345/10000=1,得到1以后又如何扔掉1呢?类似上面,12345%10000=2345,再以此类推。我们由12345很容易看出除以10000,计算机怎么知道除以10000呢?如果是123456789位数字呢?发现五位数要除以10^4即10000。要实现这个首先就要调用上面的GetFigures函数了。
#include<stdio.h>
#include<math.h>
void PrintOrder(int n)
{
if (n < 0)
{
printf("-");
n = -n;
}
int a=Getfigures(n);//这里求位数函数不再出现具体
int b=(int)pow(10.0,a-1);
do
{
printf("%d",n/b);
n%=b;//先丢掉第一位
b/=10;//再给b每次除10,不再重复调用
}while(n!=0);
printf("\n");
}
int main()
{
PrintOrder(12345678);
PrintOrder(-123456789);
PrintOrder(0);
return 0;
}
一些简单的数字处理暂时就是这些,如果有问题,希望看见的人多加指导,有问题也可以私信我。