}內容:
傳統的阿拉伯數字,不同的數字會因其所在的位數而有不同的意義,像是 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;
}
沒有留言:
張貼留言