先来看一下这个编程的题目:
输入一个非负整数,正序输出它的每一位数字
例如:输入13425.输出1 3 4 2 5
我们先来看一下,两个循环的代码,就是第一个循环先把一串数字逆序,然后在把逆序的数字再逆序然后依次输出:
#include<stdio.h>
int main()
{
int x;
scanf_s("%d", &x);
int t=0;
do
{
int d = x % 10;//还是和后面一样的每次取出我们所输入的数字的个位数。
t = t * 10 + d;//这块是把之前的每一位都放在下一轮循环出来的数字的前一位,然后以此类推。
x /= 10;//每次在总数中去除个位数。
} while (x > 0);
printf("x=%d,t=%d\n",x, t);
x = t;//由于前面的一系列的变化,这时的x的值为0.所以我们应该把成功逆序的t赋值给x。
//注意下面这个循环是把一个整数逆序输出,因为不知道整数的位数一共为多少,所以只有从最低位开始,依次输出。
do
{
int d = x % 10;//这个方法在前面讲过,就是每次取出这个数字的个位数。
printf("%d", d);
if (x>9)
{//这块是非常细节的一个点,主要是在于,如果我们每输出一个数字就打印一个空格的话,那样在最后一个数字输出的时候还会出现一个空格。
printf(" ");//于是我们通过判断最后是否为最后一轮(即除以10的数为0或者为个位数的时候),不输出空格,那么输出空格的就是反向的条件。
}
x /= 10;//取完当前的x的个位数的时候,再去掉x的个位数。
} while (x > 0);
printf("\n");
return 0;
}//只适用于末尾没有0的方案。
当然要注意的是,这个代码只能应用于末尾没有0的数字,比如700,在我们的逆序之后,就变成了7.
我们再用另一种方法来解决这个问题:
经过无数次的改动,结果是这个样子的:
#include<stdio.h>
#include<math.h>
int main()
{
int x;
scanf_s("%d", &x);
//int cnt = 0;
int mask = 1;
int t = x;//先把x存住,然后再后面的第二个循环的时候再用这个x。
//我们在前面进行一个输入的位数的判断:
//do
while(t>9)//使用do-while循环的话会提前先进入一轮,对于个位数来讲不太友好,所以换成while,在输入前进行判断。
{
t /=10;//这边还是按照每次去除一个个位数的方法来进行数字的位数的判断。
mask *= 10;
} //while (x>9);//这边大于9的原因是如果大于0的话就会再多跑一轮,如果大于9的话就会刚刚好。
//printf("mask=%d\n",mask);
//int mask = pow(10, cnt - 1);//这是一个较为麻烦的方法,不如在循环里面每一次都乘10那样计算。
//int mask =1000;//当然这块的mask应该不是固定的,我们输入的不一定都是5位数,也有其他的位数。
do
{
int d = x / mask;//这个d就是把每一次的最高位给拿出来,在循环的最后输出。
printf("%d", d);
if (mask > 9)//注意的是如何避免0的中间没有空格,和下面的70000之变成7的方法,就是,不再判断x的值是否为0而是判断mask的值是否为0。
{
printf(" ");
}
x %= mask;
mask /=10;
//printf("x=%d,mask=%d,d=%d\n", x, mask, d);
//printf("%d", d);
} while (mask> 0);
return 0;
}
具体的过程,都在注释里面。
再看一下最后的结果:
![](https://img-blog.csdnimg.cn/img_convert/1afabaa492efa3a936202e4d53e13115.png)
![](https://img-blog.csdnimg.cn/img_convert/4056ee96074434238ef70f42c4a30c99.png)
![](https://img-blog.csdnimg.cn/img_convert/d7610b8e36ec7312234483336b36e674.png)