zoukankan      html  css  js  c++  java
  • 剑指offer—第三章高质量的代码(按顺序打印从1到n位十进制数)

    题目:输入一个数字n,按照顺序打印出1到最大n位十进制数,比如输入3,则打印出1,2,3直到最大的3位数999为止。

    本题陷阱:没有考虑到大数的问题。

    本题解题思路:将要打印的数字,看成字符串,不足位的,高位补0。打印字符串的时候要对数字进行判断,不要将高位的0打印出来。打印字符串的结束条件是,当最高位产生进位时结束。

    c++代码:

    #include<iostream> 
    using namespace std;  
    //字符串模拟加法  
    bool Increment(char* number)  
    {  
        //溢出判定  
        bool isOverFlow = false;  
        //进位  
        int nTakeOver = 0;  
        //长度  
        int nLength = strlen(number);  
      
        for(int i = nLength - 1; i >= 0; i--)  
        {  
            //第n位的值等于第n位字母的ascii减去 0 的ascii 再加第n+1位的进位  
            int nSum = number[i] - '0' + nTakeOver;  
            if(i == nLength - 1)  
                ++nSum;  
            if(nSum >= 10)  
            {  
                if(i == 0)  
                    isOverFlow = true;  
                else  
                {  
                    nSum -= 10;  
                    nTakeOver = 1;  
                    number[i] = '0' + nSum;  
                }  
            }  
            else  
            {  
                number[i] = '0' + nSum;  
                break;  
            }  
        }  
        return isOverFlow;  
    }  
    //打印字符串表示的数字  
    void PrintNumber(char* number)  
    {  
        bool isBegining0 = true;  
        int nLength = strlen(number);  
      
        for(int i = 0; i< nLength; ++i)  
        {  
            if(isBegining0 && number[i] != '0')  
                isBegining0 = false;  
            if(!isBegining0)  
            {  
                printf("%c",number[i]);  
            }  
        }  
        printf("	");  
    }
    void Print1ToNDigits(int n)  
    {  
        if(n<0)   
            return;  
        char *number = new char[n+1];  
        memset(number, '0', n);  
        number[n] = '';  
        while(!Increment(number))  
        {  
            PrintNumber(number);  
            //printf("%s 
    ",number);  
        }  
      
        delete []number;  
    } 
    void main(){  
        //输出到文件  
        //freopen("output.txt","w",stdout);  
        Print1ToNDigits(3);  
    }

    Java代码:

    思路:将n位数看做排列组合问题,有3个位置,每个位上从0到9中选一个数字放进去,求所有的排列情况。

    三个位置是依次放进去数字的,这可以用递归。

    每个位置上0到9的十种情况可以用for循环来遍历。

    另外,记得函数最开始进入时要检查边界条件。

    public class Print1ToMaxOfNDigits {
    	
    	
    	/**打印从1到最大的N位十进制数
    	 * @param n 位数
    	 */
    	public static void print1ToMaxOfNDigits(int n){
    		//先检查边界条件
    		if(n<=0)
    			return;
    		char[] result=new char[n];
    		printRecursively(result,0);
    	}
    
    	/** 将n位数看做排列组合问题,每个位上从0到9中选一个数字,这样n位数可以在递归中形成。
    	 * @param result 存储n位数,每个元素是一位
    	 * @param index 第index位从0到9中取一个数字。第index位取完数字后,index加1,递归,让下一位选数字。直到i等于result的长度为止,
    	 * 这时n位数就形成了,打印它,回退一步改变最后位置的数字。这样递归下去直到所有数字都打印完毕
    	 */
    	private static void printRecursively(char[] result, int index) {
    		if (index==result.length) {
    			printNumber(result);
    			return;
    		}
    		for(int i=0;i<10;i++){
    			result[index]=(char) (i+'0');
    			printRecursively(result, index+1);
    		}
    		
    	}
    
    	/** 高位是0的话不打印,直到遇到不是0的数字为止,截取这一位直到结束的字符串,打印之。
    	 * @param result
    	 */
    	private static void printNumber(char[] result) {
    		// TODO Auto-generated method stub
    		String s=String.valueOf(result);
    		for (int i = 0; i < result.length; i++) {
    			if (result[i]!='0') {
    				System.out.println(s.substring(i));
    				return;
    			}
    		}
    	}
    	
    	public static void main(String[] args){
    		print1ToMaxOfNDigits(2);
    	}
    
    }
    
  • 相关阅读:
    Python进阶2.3 with的使用
    thinkswoole 跨域
    调用windows服务来监视文件夹状态
    IIS 文件名、目录名或卷标语法不正确解决方法一例
    jqgrid 动态列生成
    Oracle 术语解释 只有一部分
    招聘.NET高级软件工程师
    Zabbix监控集群操作用户“登录失败次数“和“失败日志记录“
    Gin框架组合(Zap、lumberjack、ini)使用手册
    逛书城有感
  • 原文地址:https://www.cnblogs.com/hupp/p/4563532.html
Copyright © 2011-2022 走看看