题目描述
输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1,2,3一直到最大的三位数999
题目分析
初看题目比较简单,但是由于n的大小未知,无论是 int 还是 long long 都不一定满足要求,此问题实则为大数问题,一般通过字符串或者数组来解决。本题用字符串解决,主要完成利用字符串实现十进制数的加法(或利用排列组合得到1到最大的n位十进制数),字符串的打印
程序代码
思路1:利用字符串模拟十进制加法,核心在与进位的处理
#include<iostream>
#include<string>
using std::cout;
using std::endl;
using std::string;
void Print1ToMaxofNDighits(int n);
bool Increment(string &str);
void PrintNumber(string &str);
void main()
{
int n = 3;
Print1ToMaxofNDighits(n);
system("pause");
return;
}
void Print1ToMaxofNDighits(int n)
{
//创建字符串
string str;
for(int i=0; i<n; i++)
str.push_back('0');
while(Increment(str))
{
PrintNumber(str);
}
//利用排列组合得到数
//PAILIE(str, 0);
}
bool Increment(string &str)
{
int length = str.length();
int carry = 0;//进位
int i = length-2;
//最低位加1
if(str[length-1] == '9')
{
str[length-1] = '0';
carry = 1;
}
else
str[length-1] = str[length-1] + 1;
//进位处理
while(i>=0 && carry==1)
{
if(str[i] == '9')
{
str[i] = '0';
carry = 1;
i--;
}
else
{
str[i] = str[i] + 1;
carry = 0;
}
}
//是否增加到最大值
if(i < 0)
return false;
else
return true;
}
void PrintNumber(string &str)
{
int i = 0;
//判断第一个不为0的字符
while(str[i]=='0' && i<str.length())
i++;
for(int j=i; j<str.length(); j++)
cout << str[j];
cout << endl;
}
思路2:利用排列组合,n位十进制数实则是n位字符的排列组合,每个字符都可以 ‘0’ ~ ‘9’
void PAILIE(string &str, int index)
{
//递归出口
if(index == str.length())
{
PrintNumber(str);
return;
}
for(int i=0; i<10; i++)
{
str[index] = '0' + i;
PAILIE(str, index+1);
}
}