http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0031
解き方としては元の数を2で割り、その商をまた2で割る。というのを繰り返し、余りが1であるときその桁の分銅を表示しています。繰り返しは商が0になったところで終了。
ところが、何度やっても「Presentation Error」…
なんでじゃ~~~~~~~といろいろな方法を試してみてようやく原因がわかりました。
答えの分銅をdigit[i]が1であるときに出力する部分なんですが、
Presentation Error
最後の改行前に空白あり
for(i = 0; i < 10; i++) { if (digit[i] == 1) printf("%d ", weight[i]); } printf("\n");↓
Accepted
最後の改行前に空白なし
for(i = 0; i < 10; i++) { if (digit[i] == 1) end = i; } for(i = 0; i < 10; i++) { if (i == end) { printf("%d\n", weight[i]); break; } if (digit[i] == 1) printf("%d ", weight[i]); }最後の出力で改行前に空白があってはいけないようです。知らなかった…orz
余分な空白や改行はダメだよ的なアレですかね。
最後に1が入っている配列の番号を探し、その時だけ「%d 」ではなく「%d\n」にして対応しました。
多分もっとスマートな方法があると思います。
というわけで、以下提出したソースコードです。
#include <stdio.h> int main(void) { int i,end; int num[11] = {0}; int digit[10] = {0}; int weight[10] = {1,2,4,8,16,32,64,128,256,512}; while(scanf("%d",&num[0]) != EOF) { int digit[10] = {0}; for(i = 0; i < 10; i++) { digit[i] = num[i] % 2; num[i+1] = num[i] / 2; if (num[i+1] == 0) break; } for(i = 0; i < 10; i++) { //最後に1が入ってる配列を「end」番目とする if (digit[i] == 1) end = i; } for(i = 0; i < 10; i++) { if (i == end) { printf("%d\n", weight[i]); break; } if (digit[i] == 1) printf("%d ", weight[i]); } } return 0; }
0 件のコメント:
コメントを投稿