題目描寫敘述:
輸入數字n,按順序列印出從1到最大的n位十進位制數。比方輸入3,則列印出1、2、3一直到最大的3位數即999。
分析描寫敘述:
首先想到的是先計算出最大的n位數是多少,然後用乙個迴圈從1開始列印直到最大的n位數。
void print1tomaxofndigits_1(int n)for(i = 1; i < number; ++i)
printf("%d\t", i);
}
注意上面的**段,由於題目僅僅是給出了n位數。但沒有說明是這個n位數究竟有多大,這是乙個大數問題。
比方n>32之後。就會出現溢位問題。因此必須考慮大數問題。選用字串來表達大數,即字串中每乙個字元都是0到9之間的某乙個字元。用來表示數字中的一位。
由於數字最大是n位的。因此須要乙個長度為n+1的字串(字串中最後乙個是結束符'\0')。
當實際數字不夠n位的時候,在字串的前半部分補0。
首先把字串中的每個數字都初始化為'0'。然後每一次為字串表示的數字加1,再列印出來。因此須要做兩件事:1、在字串表達的數字上模擬加法;2、把字串表達的數字列印出來。
void print1tomaxofndigits_1(int n)return;
}
#define false 0#define true (!false)
typedef int status;
status increment(char *number)
}else
} return isoverflow;
}
上面的函式,須要知道何時停止number上加1,即什麼時候到了最大的n位數。
能夠比較在每次遞增後與最大數做比較(用strcmp函式),但複雜度是o(n)。當到達最大數時,假設繼續加1操作,最高位就會溢位。
因此在每一次新增1之後高速推斷是不是到了最大的n位數是本題小陷阱。它實現了用o(1)時間推斷是不是已經到了最大的n位數。
void printnumber(char *number)printf("\t");
}
在輸出number時,要注意對於比較小的數,如093。我們僅僅須要輸出93。而不是輸出093。
注意:假設面試題是關於n位的整數而且沒有限定n的取值範圍,或者是輸入隨意大小的整數,那麼這個題目非常有可能是須要考慮大數問題的。字串是乙個簡單、有效的表示大數的方法。
劍指offer 列印1到最大n位數
面試題12 題目 輸入數字n,按照順序答應出從1最大的n位十進位制數。比如輸入3,則列印出1 2 3一直到最大的三位數即999。對於這道題進行時,咱們會進行一些分析,當你輸入3時,最大的三位數是999,這就是說這個最大的數是9 10 n 1 9 10 n 2 9 10 0。所以在這我想學習c語言的初...
劍指offer 列印1到最大的n位數
題目 輸入數字n,按順序列印出從1最大的n位十進位制數。比如輸入3,則列印出1,2,3一直到最大的3位數999.1 這是乙個典型的大數加法問題,當面試官不允許使用biginteger實現大數加法的時候,通常是使用字串或者陣列實現其功能。2 在大數的加法中,我們需要注意的問題是對變數number不斷遞...
劍指offer 列印1到最大的n位數
題目 輸入數字n,按順序列印出從1到最大的n為十進位制數。比如輸入3,則列印出1,2,3一直到最大的三位數即999。思路 這道題一看就是乙個大數問題。對於解決這個大數的問題,可以用到字串或者陣列都可以。字串解法 對於乙個字串的話,首先要考慮申請空間的時候,要申請n 1個因為最後還有乙個 0 進行加法...