2011年11月26日 星期六

羅馬數字

}內容:
傳統的阿拉伯數字,不同的數字會因其所在的位數而有不同的意義,像是 123 的 1 是代表一百,而 321 的 1 是代表 1,所以阿拉伯數字所代表的數字不是單純各個位數相加,必須考慮到位數。

羅馬數字則不同,是由 I, V, X, L, C, D, M 所組成的。其中 I 代表 1 、 V 代表 5 、 X 代表 10 、 L 代表 50 、 C 代表 100、 D 代表 500 而 M 代表 1000 ,書寫的時候由左往右,先寫代表數字較多的字母。所代表的數字,可將其所有羅馬數字所代表的數字相加而得,例如:XVI = 10 + 5 + 1 = 16。另外羅馬數字還提供了減法原則,如果寫 XIV ,所代表的意義是 10 + 5 - 1 = 14。不能與自己相差 10 倍以上的數字組合使用,例如用 IC 代表 99 是不允許的。

試撰寫一程式,將輸入的10進位數字轉換成羅馬數字。

}輸入說明 :
輸入為多行,每行包含一正整數 n(1<=n<4000) 。
}輸出說明 :
針對每個輸入 n,輸出一行其羅馬數字表示法。
}範例輸入 :
3999
3888
}範例輸出 :
MMMCMXCIX (not MMMIM)
MMMDCCCLXXXVIII




#Code
#include <stdio.h>
#include <string.h>

char table[4][2] = {
    {'I', 'V'}, {'X', 'L'}, {'C', 'D'}, {'M', ' '}
};

int table2[9][2] = {
    {0, 0}, {0, 1}, {0, 2}, {0, 3}, {0, 0},
    {1, 0},{1, 1}, {1, 2}, {1, 3}
};

int main(void)
{
    char n[5];
    int i, j, k, len;

    while (scanf("%s", n) == 1)
    {
        len = strlen(n);
        for (i = 0; i < len/2; i++)
        {
            k = n[i];
            n[i] = n[len-i-1];
            n[len-i-1] = k;
        }

        for (i = len-1; i >= 0; i--)
        {
            if (n[i] != '0' && n[i] != '4' && n[i] != '9')
            {
                for (j = 1; j <= table2[n[i]-'0'][0]; j++)
                    putchar(table[i][1]);
                for (k = 1; k <= table2[n[i]-'0'][1]; k++)
                    putchar(table[i][0]);
            }
            else if (n[i] == '4')
            {
                putchar(table[i][0]);
                putchar(table[i][1]);
            }
            else if (n[i] == '9')
            {
                putchar(table[i][0]);
                putchar(table[i+1][0]);
            }
        }
        printf("\n");
    }

    return 0;
}

沒有留言:

張貼留言