剣指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
****************************************************************/