件名の説明:
数nは、1からnビットの小数ために最大の印刷を入力してください。例えば、入力3、次いで1、2、3桁999の最大までプリントアウト。
分析:多数に属することができるように、直接、最大Nビットの10進数を入力することができないことに注意してください、この数は、したがって、文字列または長いlong int型のストレージを表すために必要とすることができません。
アイデア:我々は、すべてのNビットの溶液に整列され、各ビットは、0から9までの数とすることができます。再帰的なソリューションを提供します。先頭の0は、プリントとして出力しないように注意した場合にのみ1-9、1-9 2印刷(代わりに01の、...)、10-99。
1の#include <iostreamの> 2の#include <アルゴリズム> 3の#include <cstdioを> 4の#include <CStringの> 5 使って 名前空間STD。 6 ボイド Print1ToMaxOfNDigitsRecursively(チャー *番号、int型の長さ、int型のインデックス)。 7 8 ボイド PrintNumber(チャー *の数){ 9 int型のインデックス= 0 。 10 ブール isBeginning0 = 真。 11 INT NLENGTH = STRLEN(数) 12 // 最初のインデックスの左へのインデックスはゼロではありません。特に注目すべきは、すべてゼロである文字列全体で 13である ため(int型 I = 0 ; IはNLENGTHを<I ++は{) 14 IF(番号[I] =!' 0 ' ){ 15 、インデックス= I; 16 BREAK ; 17 } 18である } 。19 IF(!(インデックス== 0 &&番号[インデックス] == ' 0 ' {)) 20である ため(int型 ; IはNLENGTHを<I ++はI =指数{) 21である のprintf(" %のC " 、番号[I])。 22 } 23 のprintf(" の\ n " ); 24 } 25 } 26 27 空隙 Print1ToMaxOfNDigits(int型N){ 28 であれば(N <= 0 ){ 29 リターン。 30 } 31 のchar *数= 新しい 文字 [N + 1 ]。 32 数[N] = ' \ 0 ' 。 33 のための(int型I = 0 ; I < 10 ; 私は++ ){ 34 数が[ 0 ] = iは+ ' 0 ' 。 35 Print1ToMaxOfNDigitsRecursively(数n、0 ); 36 } 37 削除[]の数と、 38 } 39 40 空隙 Print1ToMaxOfNDigitsRecursively(CHAR *番号、int型の長さ、int型のインデックス){ 41 であれば(インデックス==長さ- 1 ){ 42 PrintNumber(番号) 43 返します。 44 } 45 のための(int型 I = 0 ; iが< 10 ; iが++ ){ 46 数[インデックス+ 1 ] = I +は' 0 ' 。 47 Print1ToMaxOfNDigitsRecursively(数、長さ、インデックス+ 1 )。 48 } 49 } 50 51 INT メイン(){ 52 のint 番号; 53 一方(CIN >> 数){ 54 Print1ToMaxOfNDigits(番号) 55 } 56 リターン 0 。 57 }