码迷,mamicode.com
首页 > 其他好文 > 详细

剑指offer—第三章高质量的代码(按顺序打印从1到n位十进制数)

时间:2015-06-09 16:38:29      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:

题目:输入一个数字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);
	}

}

 

剑指offer—第三章高质量的代码(按顺序打印从1到n位十进制数)

标签:

原文地址:http://www.cnblogs.com/hupp/p/4563532.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!