题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1,2,3一直到最大的3位数即999.
题目陷阱:大数问题
在字符串上模拟数字加法的解法:
void Print1ToMaxOfNdigits(int n)
{
if(n<=0)
return ;
char *number=new char[n+1];
memset(number,'0',n);
number[n]='\0';
while(!Incrememt(number))
{
printNumber(number);
}
delete []number;
}
如何在每一次增加1之后快速判断是不是到了最大的n位数是本题的一个小陷阱。
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(isBeginning0 && number[i]!='0')
isBeginning0=false;
if(!isBeginning0)
{
printf("%c",number[i]);
}
}
printf("\t");
}