剑指offer[面试题17:打印从1到最大的n位数]

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

思路:

隐藏考点:当输入的n很大时,用整型(int)或者长整型(long int)求最大的n位数都会溢出。也就是需要考虑大数问题。

用递归实现全排列,数字(用字符串容器装)的每一位都是0~9中的一个数,然后设置下一位。递归结束的条件是已经设置了数字的最后一位。

 

class Solution {
public:
	void PrintMaxOfDigits(int n){
		if (n <= 0)
			return;
		vector<char> number(n,0);
		for (int i = 0; i < 10; i++){
			number[0] = i + '0';  // int+char得到char类型的0-9
			printRecursively(number, n, 0);
		}
	}

	// 最好以地址形式传入,vector<char> &number
	void printRecursively(vector<char> &number, int length, int index){
		if (index + 1 == length){
			printNumber(number);
			return;
		}
		for (int i = 0; i < 10; i++){
			number[index + 1] = i + '0';
			printRecursively(number, length, index + 1);
		}
	}

	void printNumber(vector<char> &number){
		int sum = 0;
		for (int i = 0; i < number.size(); i++){
			sum = sum * 10 + (number[i]-'0');
		}
		cout << sum << endl;
	}
	

};

  

posted @ 2019-08-20 11:46  Nice_to_see_you  阅读(162)  评论(0编辑  收藏  举报