PTA|基础编程题目集|7-3
解题
题目的意思简单明了:输入一个三位正整数,逆序输出即可(输出要符合日常习惯),也就是前导不能出现0
。由于题目明确了是一个三位数,所以很自然的可以通过分解个位、十位、百位数字,依次输出即可。实例代码(部分)见下:
int abc,a,b,c;//依次为三位正整数及个位、十位、百位数字
a=abc/100;
b=abc/10%10;
c=abc%100;
//最后依次输出c,b,a即可。需要考虑的是,c,b可能部分或同时为0。输出要符合日常规范,这就需要分情况讨论如下
if(c!=0)
printf("%d%d%d",c,b,a);
else{
//c==0
//printf("%d%d",b,a); //可能你会这样输出,但是也存在可能性b==0,这样也不符合习惯,
//于是经过思考你可能会改成如下方式
if(b!=0)
printf("%d%d",b,a);
else
printf("%d",a);
}
上述方式确实能够实现题目的要求,但是逻辑不清楚,很容易出错(尽管我开始没有使用上述方式,但是还是没有考虑周全前导0的情况)。如果将三位数改成四位乃至更多位数,显然需要分离的数字更多,(嵌套)分支更多,将会使问题变得更加复杂。
问题的困难在于不输出前导0。我们很自然的想到就是去判断为0否。经过前述,发现不是一个好的方法。那么有没有什么较好的方式呢?
从abc-->cba,如何才能不输出前导0呢?
思考5秒钟
实际上,cba=c*10^2+b*10^1+a*10^0
,如果前导c(或者b)为0的话,通过运算的方式自然就规避了,就不需要过多的分支判断了。
abc-->cba,
简要步骤如下:
首先得到c,将c
加起来;
其次得到b,此时b
要放在c
后面,即cb
,通过运算即可得到:c*10+b
;
再次得到a,此时a
要放在cb
后面,即cba
,通过运算即可得到:cb*10+a
;
如果有更多的位数,一直迭代即可
如上,通过循环、迭代、计算的方式就可以规避前导0的问题,并且能够适合更多的位数,也避免了逻辑的混乱和复杂。
关键点
- 循环
- 迭代
- 计算(累加)
参考代码
#include "cstdio"
int main()
{
//3位的正整数,逆序输出,重点考虑120(21),900(9)
int var;
scanf("%d",&var);
int temp;
int rev=0;
while(var)
{
temp=var%10; //模余
var/=10; //缩放
rev*=10; //迭代累加
rev+=temp;
}
printf("%d\n", rev);
return 0;
}