剑指offer: 打印从1到最大的n位数
题目:
输入数字n,按顺序打印从1到最大的n位十进制数。比如输入3,则打印出1、 2 、3 直到999。
思路:
1.利用字符串模拟数字的加法。
2.采用全排列的思路,并使用递归实现全排列。
实现:
思路1:
class Solution{
public:
void Print1ToMax(const int n){
char* digit = new char[n+1]; //使用字符串数组模拟一个大的整数,注意要加上'\0'
memset(digit, '0', n); //将每一位都初始化为0;
digit[n] = '\0';
while(!Increment(digit, n)) //Increment负责给当前digit+1,返回值是是否到达最大值
{
PrintDigit(digit, n); //PrintDigit负责打印当前数字
}
}
private:
bool Increment(char* digit, int n)
{
bool flag = false; //flag标记了是否达到了第0位
int carry = 0; //carry表示是否进位
int temp; //temp是一个临时的int型变量
int start = n - 1; //从最后一位开始
temp = digit[start] - '0' + 1;
digit[start] = temp % 10 + '0';
if (temp == 10)
{
carry = 1; //产生了进位
while(carry == 1)
{
start--;
if (start < 0) return true; //第0位产生了进位
temp = digit[start] - '0' + 1;
digit[start] = temp % 10 + '0';
carry = (temp == 10) ? 1 : 0;
}
}
return false;
}
void PrintDigit(char* digit, int n)
{
/*从左边第一个不为0的数字开始打印 */
int start = 0;
while(digit[start] == '0') start++;
for (int i = start; i < n; i++) printf("%c", digit[i]);
printf("\n");
}
};
思路2:
class Solution{
public:
void Printoneton(int n)
{
char* number = new char[n+1];
number[n] = '\0';
for(int i = 0; i <= 9; i++)
{
number[0] = '0' + i;
dfs(number, n ,0); //从第0位开始搜索
}
delete []number;
}
private:
void dfs(char* number, int n, int index)
{
if (index == n - 1) //递归出口,当index == n-1
{
PrintDigit(number, n);
return;
}
for (int i = 0; i <= 9; i++)
{
number[index+1] = '0' + i;
dfs(number, n, index + 1);
}
}
void PrintDigit(char* digit, int n)
{
/*从左边第一个不为0的数字开始打印 */
int start = 0;
while(digit[start] == '0') start++;
for (int i = start; i < n; i++) printf("%c", digit[i]);
printf("\n");
}
};