題目:輸入數字 n,按順序輸出從 1 最大的 n 位 10 進制數。
比如輸入 3,則輸出 1、2、3 一直到最大的 3 位數即 999。
--------------------------------------------------
(1)第一種:直接法
這道題看起來還是比較簡單的
void CountNum(int N){
int max=0;
while(N-->0)
max = 10*max + 9;
int i = 1;
while(i<=max)
cout<<i++<<endl;
}
似乎這麼不到十行就解決了,
不過大家可以考慮幾個問題再改進改進。
如果輸入的是20位,30位或者更大呢?
這時候我們用longlong都會溢出了,所以我們這裏不能用常規的加法進行,可以用字符串來模擬加法運算
我們new char[N+1]個字節單元,最後一個放輸出結束符號'\0'
那麼我們每次對低位+1如果等於9了,那麼就往前加一,模擬加法,這就不會有溢出現象了。
借用一個str表示當前計算到的最高位,每次從這裏輸出即可
void CountNum2(int N){
char *str = new char[N+1];
memset(str,'0',N);
str[N]='\0';
str[N-1]='1';
char *end = str + N-1;
char *count = end;//end表示個位數在的位置
int n = N;
bool isOver= false;//是否結束的標誌
str=count;//str記錄了當前最高位的位置
while(!isOver){
cout<<str<<endl;
while(!isOver && *count == '9'){
//這裏循環是往高位找到一個非9的纔可以加1
*count = '0';
if(str==count){
if(n>1){
n--;
str--;
count--;
}else
isOver= true;
}else
count--;
}
//not 9
(*count)++;
count = end;
}
}
其實上面加法模擬中我們發現低位一直在進行一個遞歸操作,即 ”當前位=9,向高位+1,且當前位=0,再從低位開始加法“
void CountNum3(int N){
char *str = new char[N+1];
memset(str,'0',N);
str[N]='\0';
Count(str,str,str+N-1);
}
void Count(char* p, char *str, char *end){
if(p == end){
while(*p < '9'){
(*p)++;
Print(str);
}
return;
}
while(*p <= '9'){
*(p+1) = '0'-1;
Count(p+1,str,end);
(*p)++;
}
}
void Print(char *str){
while(*str == '0')
str++;
cout<<str<<endl;
}
輸出結果如下:
1
1
2
3
4
5
6
7
8
9