http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0031
解き方としては元の数を2で割り、その商をまた2で割る。というのを繰り返し、余りが1であるときその桁の分銅を表示しています。繰り返しは商が0になったところで終了。
ところが、何度やっても「Presentation Error」…
なんでじゃ~~~~~~~といろいろな方法を試してみてようやく原因がわかりました。
答えの分銅をdigit[i]が1であるときに出力する部分なんですが、
Presentation Error
最後の改行前に空白あり
1 2 3 4 5 6 | for (i = 0; i < 10; i++) { if (digit[i] == 1) printf ( "%d " , weight[i]); } printf ( "\n" ); |
Accepted
最後の改行前に空白なし
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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]); } |
余分な空白や改行はダメだよ的なアレですかね。
最後に1が入っている配列の番号を探し、その時だけ「%d 」ではなく「%d\n」にして対応しました。
多分もっとスマートな方法があると思います。
というわけで、以下提出したソースコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #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 件のコメント:
コメントを投稿