剑指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("\t");  
}
void Print1ToNDigits(int n)  
{  
    if(n<0)   
        return;  
    char *number = new char[n+1];  
    memset(number, '0', n);  
    number[n] = '\0';  
    while(!Increment(number))  
    {  
        PrintNumber(number);  
        //printf("%s \n",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);
	}

}

 

posted @ 2015-06-09 14:48  lisahappy  阅读(301)  评论(0编辑  收藏  举报