2014年4月13日日曜日

AOJ 0031 c

AOJの0031、要は10進数を2進数にする問題。(ただし10進数は1023以下となっています)
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]);
}
最後の出力で改行前に空白があってはいけないようです。知らなかった…orz
余分な空白や改行はダメだよ的なアレですかね。

最後に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 件のコメント:

コメントを投稿