问题:输入数字n,按顺序打印出从1到最大的n位十进制数。
输入:n
输出:打印数字
思路:
易错思路:求出最大的n位十进制数,然后for循环打印。
错误原因:最大的n位十进制数有可能超出int型(或longlong型)。
利用数组(或字符串)来表达大数。
代码:
#include <iostream>
#include <string.h>
using namespace std;
bool Increment(char* number)
{
bool isOverflow=false;
int nTakeOver=0;
int nLength=strlen(number);
for(int i=nLength-1;i>=0;--i)
{
int nSum=number[i]-'0'+nTakeOver;
if(i==nLength-1)
++nSum;
if(nSum>=10)
{
if(i==0)
isOverflow=true;
else
{
nSum-=10;
nTakeOver=1;
number[i]='0'+nSum;
}
}
else
{
number[i]='0'+nSum;
break;
}
}
return isOverflow;
}
void PrintNumber(char* number)
{
bool isBeginning0 = true;
int nLength=strlen(number);
for(int i=0;i<nLength;++i)
{
if(number[i]!='0'&&isBeginning0)
isBeginning0 =false;
if(!isBeginning0)
{
printf("%c",number[i]);
}
}
printf("\t");
}
void Print1ToMaxOfNDigits(int n)
{
if(n<=0)
return;
char *number=new char[n+1];
memset(number,'0',n);
number[n]='\0';
while(!Increment(number))
{
PrintNumber(number);
}
delete[] number;
}
int main()
{
int n=3;
Print1ToMaxOfNDigits(n);
return 0;
}
复杂度分析:
时间复杂度为,空间复杂度