zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    Android error--No implementation found for native Lcomd
    【CareerCup】Trees and Graphs—Q4.3
    android 分享到QQ空间的全部操作
    ubuntu12.04安装翻译软件stardict及卸载
    Java获取当前操作系统的信息
    WebForm和MVC中都可以使用的路由
    使用 System.Transactions 进行事物管理
    .NET中四种常用事物
    sql语句:创建事物
    sql语句:CASE WHEN END 的用法
  • 原文地址:https://www.cnblogs.com/reaptem/p/13756579.html
Copyright © 2011-2022 走看看