题目:
输入数字n,按顺序打印出从1到最大的n位10进制数。比如输入3,则打印,1,2,3直到999
分析:
这是一个大数问题,使用字符串来模拟数字,并实现字符串模拟数字加1的操作
具体实现如下:
#include <iostream>
using namespace std;
//这是一个大数问题
//如果使用常规解法,先计算出最大的n位数,然后从1遍历到最大的数,对于int,long,long long在位数非常大的时候就表示不了了
//应该使用字符串来模拟数字,并且模拟数字的+1操作,一个n位数,只需n个字符来表示
//模拟字符串+1的操作,这里数组下标小的代表低位
bool Increment(char *number)
{
bool isOverFlow = false;
int nTakeOver = 0; //表示进位
int length = strlen(number)-1;
for(int i=0; i<=length; ++i)
{
int nSum = number[i] - '0'+nTakeOver;
if(i==0)
{
nSum++;
}
if(nSum >= 10)
{//进位操作
if(i==length)
{
isOverFlow = true;
}
else
{
nTakeOver = 1;
nSum -= 10;
number[i] = nSum +'0';
}
}
else
{
number[i] = nSum+'0';
break;
}
}
return isOverFlow;
}
//打印字符串的操作,要按照数字的使用习惯打印
void PrintNumber(char *number)
{
int length = strlen(number)-1;
bool isNumber = false;
for(int i=length; i>=0; --i)
{
if(!isNumber && number[i] != '0')
{
isNumber = true;
}
if(isNumber)
{
cout<<number[i];
}
}
cout<<endl;
}
void PrintFrom1ToMax(int n)
{
if(n<=0)
{
return ; //error,退出
}
char *number = new char[n];
//初始化数组中的每一位为字符0
for(int i=0; i<n; ++i)
{
number[i] = '0';
}
number[n] = '\0';
//模拟数字加1的操作,这时要考虑结束条件,只有最高位进位的时候才应跳出循环
while(!Increment(number))
{
PrintNumber(number); //打印操作要符合我们使用数字的习惯
}
}
int main()
{
PrintFrom1ToMax(2);
return 0;
}
还可以使用递归,全排列来实现这个问题:
#include <iostream>
using namespace std;
//打印字符串的操作,要按照数字的使用习惯打印
void PrintNumber(char *number)
{
int length = strlen(number)-1;
bool isNumber = false;
for(int i=length; i>=0; --i)
{
if(!isNumber && number[i] != '0')
{
isNumber = true;
}
if(isNumber)
{
cout<<number[i];
}
}
cout<<endl;
}
//递归循环
void Increment(char *number, int n)
{
//cout<<n<<endl;
if(n<=0)
{
PrintNumber(number);
return ;
}
for(int i=0; i<10; ++i)
{
number[n-1] = i + '0';
Increment(number,n-1);
}
}
//还可以通过排列组合来做,使用递归的思想来编写
void PrintFrom1ToMax(int n)
{
if(n<=0)
{
return ;
}
char *number = new char[n];
for(int i=0; i<n; ++i)
{
number[i]= '0';
}
number[n] = '\0';
Increment(number, n);
}
int main()
{
PrintFrom1ToMax(1);
return 0;
}