剣指OFFERの印刷1から最大のN桁(9度OJ 1515)

7559 ワード

タイトルの説明:


1桁の数字Nが与えられ、1から最大のN桁まで印刷される.
 

入力:


各入力ファイルには、テストサンプルのセットのみが含まれます.各テストケースについて、数値N(1<=N<=5)を入力します.
 

出力:


各テストケースに対応して、1から最大のNビット数まで順次印刷します.
 

サンプル入力:

1 

 

サンプル出力:

1

2

3

4

5

6

7

8

9

問題解決の考え方:


直接nを介して最大の数より1大きい数を指定し、101001000001000000...
出力、でいい...

コード:

#include <stdio.h>

int main(void){

    int n,i;

    while(scanf("%d",&n)!=EOF && n>=1 && n<=5){

        i = n;

        int m = 1;

        while(i--){

            m *= 10;

        }

        for(i=1;i<m;i++)

            printf("%d
",i); } return 0; } /************************************************************** Problem: 1515 User: xhalo Language: C Result: Accepted Time:40 ms Memory:912 kb ****************************************************************/

上のコードを書くと、正式に面接官の穴に落ちます.もしこの問題の桁数が5ではなく、10か100だったら.正常なintは明らかに満足できない.
したがって,文字列や配列を用いてビッグデータを表すことが考えられる.
次に、配列を使用した表現方法を示します.
#include <stdio.h>

#include <stdlib.h>

#include <memory.h>

int num[10];

int add(int n);

int main(void){

    int n,i;

    while(scanf("%d",&n)!=EOF && n>=1 && n<=5){

        memset(&num,0,sizeof(int)*10);

        while(!add(n)){

            int flag = 0;

            for(i=10-n;i<10;i++)

                if(num[i] != 0 || flag){ // , ; , 

                    flag = 1;

                    printf("%d",num[i]);

                }

            printf("
"); } } return 0; } int add(int n){ int isoverflow = 0; int carry = 0; int i; for(i=9;i>=10-n;i--){ num[i] += carry; if(i == 9) num[i]++; if(num[i] >= 10){ if(i == 10-n){ isoverflow = 1; }else{ num[i] -= 10; carry = 1; } }else{ break; } } return isoverflow; } /************************************************************** Problem: 1515 User: xhalo Language: C Result: Accepted Time:110 ms Memory:912 kb ****************************************************************/