【剣指offer】面接問題12:最大n桁まで印刷

1814 ワード

タイトルの説明:
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); }