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 件のコメント:
コメントを投稿