这个问题是我在做学校的作业时候看到的。只隐约有印象讲过,但是忘记了怎么操作。听同学的点通才回想起来,特此写个博客留记

[toc]

逆序打印

目的:输入“789”,打印“987”

注:本博客的数字逆序只涉及 十进制

代码实现有两种方式:
1.利用if语句进行大小判断,直到选出从大到小的数字排序
这个方法十分复杂,稍不留意就会弄错,所以在实际应用中不推荐这样操作
这里就不赘述具体代码了。(才不是懒,压根没试过)
2.使用%10的方法直接打印
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main()
{
int a = 0;
scanf("%d", &a);

printf("%d", a % 10);
printf("%d", a/10 % 10);
printf("%d", a/100 % 10);
return 0;
}

代码结果如下

在这里插入图片描述

这个代码成功达到了我们的目的,但是有一个比较明显的弊端
如果我们需要更多位的数字的逆序数时,这个代码就会变得很长,而且每次都需要我们手动添加一个新的printf


代码优化1

想要逆序比较长的数字,就需要用到循环语句,我使用的是for循环
主要需要解决的问题是,a每%10一次后就需要除以10再%10一次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main()
{
int a = 0;
int n = 0;
int i = 0;
printf("请输入需要逆序的数字:");
scanf("%d", &a);
printf("请输入该数字的位数:");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
printf("%d", a % 10);
a /= 10;

}
return 0;

}

代码运行结果如下

在这里插入图片描述
我们的目的成功达成!


代码优化2

上面的代码虽然完成了我们设想的目的,但它还是有一个缺点

需要用户手动输入数字的位数

设想一下,系统需要你填写你的手机号,你输入自己的手机号后,系统还要再问问你“你的手机号有几位数”

这换谁都血压飙升,怒m代码猿了吧!

那怎样让代码自动逆转我们需要的数字呢?

注:这串代码是我在b站看到的,顿时联想到了自己的博客,于是又跑过来更新了! 原视频链接

image-20211027194352024

图里while后面的不等于符号应该是一个vscode的插件,我们需要将它改成!=

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

int main()
{
int num;
printf("请输入一个数;");
scanf("%d", &num);

int reverse = 0;
while (num != 0)
{
reverse = reverse * 10 + num % 10;
num /= 10;

}
//输出反转后的数字
printf("反转后的数字是:%d\n", reverse);
return 0;
}

image-20211027194947239

这串代码就是完美的了吗?

并不是,如果我们键入1000,结果就会发生一些细微的变化

image-20211027195122964

输出的结果竟然是1,但我们需要的应该是0001


代码优化3

这里涉及到了%d时左补0的问题

printf打印时%d左补0

假设下面这串代码是需要输出1000逆序后数字0001的printf语句

因为1000只有4位,所以我们可以在%和d之间加上04

即满4位不补,不满4位左补0

1
2
int n =1;
pirntf("%04d",n);

但在逆序数字里面,我们需要打印的数字长度是不可控的

这里需要用到左补0的另外一种代码

  • 用另外一个变量来表示数的位数
1
2
3
int n=1;
int m=3;//代表数的位数,同%03d里面3的意义一样
pirntf("%0*d",m,n);

这样下来就简单了,我们只需要在原有的while循环里面加上另外一个变量

每次逆序循环完成后,这个变量都++一次,就能达到我们的目的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main()
{
int num;
int j = 0;
printf("请输入一个数;");
scanf("%d", &num);

int reverse = 0;
while (num != 0)
{
reverse = reverse * 10 + num % 10;
num /= 10;
j++;
}
//输出反转后的数字
printf("反转后的数字是:%0*d\n",j, reverse);
return 0;
}

运行结果如下:

image-20211027200054366

这下我们的目的才真正完成了,既可以不用自己多输入一遍数字的个数

又能在输入10000这类数字的时候,逆序后自动左补0


希望这对你有帮助!