【剣指offer】面接問題12:最大n桁まで印刷
1814 ワード
タイトルの説明:
1桁の数字Nが与えられ、1から最大のN桁まで印刷される.
入力:
各入力ファイルには、テストサンプルのセットのみが含まれます.各テストケースについて、数値N(1<=N<=5)を入力します.
出力:
各テストケースに対応して、1から最大のNビット数まで順次印刷します.
サンプル入力:
サンプル出力:
テーマ解析:
問題には上限値が要求されていないため,long long定義を用いると範囲外になる可能性がある.大数の問題を解決する最も一般的な方法は、文字列と配列を利用して表現することです.
本の中にはもっと簡潔なコードがありますが、ここでは書きません.
完全なコードは次のとおりです.
1桁の数字Nが与えられ、1から最大のN桁まで印刷される.
入力:
各入力ファイルには、テストサンプルのセットのみが含まれます.各テストケースについて、数値N(1<=N<=5)を入力します.
出力:
各テストケースに対応して、1から最大のNビット数まで順次印刷します.
サンプル入力:
1
サンプル出力:
1
2
3
4
5
6
7
8
9
テーマ解析:
問題には上限値が要求されていないため,long long定義を用いると範囲外になる可能性がある.大数の問題を解決する最も一般的な方法は、文字列と配列を利用して表現することです.
本の中にはもっと簡潔なコードがありますが、ここでは書きません.
完全なコードは次のとおりです.
// , ! 。
#include
#include
#include
void PrintOneToMax(int n);
int Increment(char number[]);
void PrintNumber(char number[]);
int main()
{
int n;
while(scanf("%d",&n) == 1){
PrintOneToMax(n);
}
return 0;
}
void PrintOneToMax(int n)
{
if(n <= 0)
return ;
char *number = (char *)malloc((n+1) * sizeof(char));
memset(number,'0',n);
number[n] = '\0';
while(!Increment(number)){
PrintNumber(number);
}
free(number);
}
int Increment(char number[])
{
int OverFlow = 0;
int CarryOver = 0;
int NumLength = strlen(number);
for(int i = NumLength - 1;i >= 0;--i){
int sum = number[i] - '0' + CarryOver; // i
if(i == NumLength - 1) // ,
++sum;
if(sum >= 10){ //
if(i == 0){ // number[0] ,
OverFlow = 1;
}else{
number[i] = '0';
CarryOver = 1;
}
}else{
number[i] = '0' + sum;
break;
}
}
return OverFlow;
}
// 0
void PrintNumber(char number[])
{
int i = 0;
while(number[i] == '0')
++i;
char *numpt = &number[i];
printf("%s
",numpt);
}