輸出1到最大的N位數(shù)
[導讀]題目:輸入數(shù)字n,按順序輸出從1最大的n位10進制數(shù)。比如輸入3,則輸出1、2、3一直到最大的3位數(shù)即999。
分析:這是一道很有意思的題目。看起來很簡單,其實里面卻有不少的玄機。算法一:最直觀的算法
題目:輸入數(shù)字n,按順序輸出從1最大的n位10進制數(shù)。比如輸入3,則輸出1、2、3一直到最大的3位數(shù)即999。 分析:這是一道很有意思的題目??雌饋砗芎唵危鋵嵗锩鎱s有不少的玄機。
算法一:最直觀的算法,求出最大的n位數(shù)是多少,然后一個循環(huán)打印。
void?Print1ToMaxOfNDigits1(int?n)
{
int?number=1;
int?i=0;
while(i++<n)
number*=10;
for(i=1;?i<number;?i++)
cout<<i<<"?";
}?
算法二:字符串表示大數(shù)
當n很大時,算法一可能會溢出,所以考慮大數(shù)問題一般用數(shù)組或字符串。
用字符串表達數(shù)字的時候,最直觀的方法就是字符串里每個字符都是’0’到’9’之間的某一個字符,表示數(shù)字中的某一位。因為數(shù)字最大是n位的,因此我們需要一個n+1位字符串(最后一位為結束符號’/0’)。當實際數(shù)字不夠n位的時候,在字符串的前半部分補零。這樣,數(shù)字的個位永遠都在字符串的末尾(除去結尾符號)。
首先我們把字符串中每一位數(shù)字都初始化為’0’。然后每一次對字符串表達的數(shù)字加1,再輸出。因此我們只需要做兩件事:一是在字符串表達的數(shù)字上模擬加法。另外我們要把字符串表達的數(shù)字輸出。值得注意的是,當數(shù)字不夠n位的時候,我們在數(shù)字的前面補零。輸出的時候這些補位的0不應該輸出。比如輸入3的時候,那么數(shù)字98以098的形式輸出,就不符合我們的習慣了。
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)
{
cout<<number[i];
}
}
cout<<"?";
}
void?Print1ToMaxOfNDigits2(int?n)
{
if(n<=0)
return;
char?*number=new?char[n+1];
memset(number,?'0',?n);
number[n]='
