#include <iostream>
#include <string>
using namespace std;
// 参考《剑指offer》P94
bool increment_number(char *number){
int take_over = 0;
int len = strlen(number);
for (int i = len - 1; i >= 0; --i){
int sum = number[i] - '0' + take_over;
// 最后一位加一
if(i == len - 1){
++sum;
}
if(sum >= 10){
sum -= 10;
number[i] = '0' + sum;
take_over = 1;
// 进位到第0位,已经到达最大值
if(i == 0)
return true;
}
else {
number[i] = '0' + sum;
return false;
}
}
return true;
}
void print_number(char *number){
int len = strlen(number);
bool flag = true;
for (int i = 0; i < len; ++i){
if (flag){
if (number[i] == '0')
continue;
flag = false;
}
cout << number[i];
}
cout << endl;
}
void print_1_to_max_of_n_digits_core1(char *number, int n, int index){
if(index == n - 1){
print_number(number);
return;
}
for(int i = 0; i < 10; ++i){
number[index + 1] = '0' + i;
print_1_to_max_of_n_digits_core1(number, n, index + 1);
}
}
void print_1_to_max_of_n_digits_core2(char *number, int n, int index){
for(int i = 0; i < 10; ++i){
number[index] = '0' + i;
if(index == n - 1){
print_number(number);
continue;
}
print_1_to_max_of_n_digits_core2(number, n, index + 1);
}
}
void print_1_to_max_of_n_digits(int n){
if(n <= 0)
return;
char *number = new char[n + 1];
memset(number, '0', n);
number[n] = '\0';
// 大数加法解法
//while(!increment_number(number))
// print_number(number);
// 全排列解法1
//for(int i = 0; i < 10; ++i){
// number[0] = '0' + i;
// print_1_to_max_of_n_digits_core1(number, n, 0);
//}
// 全排列解法2
print_1_to_max_of_n_digits_core2(number, n, 0);
delete [] number;
}
int main(){
print_1_to_max_of_n_digits(2);
int ttt = 0;
return 0;
}