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
", rev);
	
	return 0;
}
原文地址:https://www.cnblogs.com/reaptem/p/13756579.html