結果
| 問題 |
No.518 ローマ数字の和
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-10-24 23:22:19 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 1 ms / 2,000 ms |
| コード長 | 2,496 bytes |
| コンパイル時間 | 1,398 ms |
| コンパイル使用メモリ | 29,440 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-19 05:38:21 |
| 合計ジャッジ時間 | 1,194 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 19 |
ソースコード
#include <stdio.h>
#include <string.h>
int toArabicNumerals(char R[])
{
int length = strlen(R), sum = 0, flag, i;
for (i = 0; i < length; ++i) {
flag = 0;
if (i < length - 1) {
if (R[i] == 'I' && R[i + 1] == 'V') {
sum += 4;
flag = 1;
}
else if (R[i] == 'I' && R[i + 1] == 'X') {
sum += 9;
flag = 1;
}
else if (R[i] == 'X' && R[i + 1] == 'L') {
sum += 40;
flag = 1;
}
else if (R[i] == 'X' && R[i + 1] == 'C') {
sum += 90;
flag = 1;
}
else if (R[i] == 'C' && R[i + 1] == 'D') {
sum += 400;
flag = 1;
}
else if (R[i] == 'C' && R[i + 1] == 'M') {
sum += 900;
flag = 1;
}
}
if (flag) {
++i;
continue;
}
if (R[i] == 'I') ++sum;
else if (R[i] == 'V') sum += 5;
else if (R[i] == 'X') sum += 10;
else if (R[i] == 'L') sum += 50;
else if (R[i] == 'C') sum += 100;
else if (R[i] == 'D') sum += 500;
else sum += 1000;
}
return sum;
}
void push(char tmp, char R[], int *top)
{
R[*top] = tmp;
++*top;
R[*top] = '\0';
}
void toRomanNumerals(char R[], int sum)
{
int top = 0;
while (sum) {
if (sum - 1000 >= 0) {
push('M', R, &top);
sum -= 1000;
}
else if (sum - 900 >= 0) {
push('C', R, &top);
push('M', R, &top);
sum -= 900;
}
else if (sum - 500 >= 0) {
push('D', R, &top);
sum -= 500;
}
else if (sum - 400 >= 0) {
push('C', R, &top);
push('D', R, &top);
sum -= 400;
}
else if (sum - 100 >= 0) {
push('C', R, &top);
sum -= 100;
}
else if (sum - 90 >= 0) {
push('X', R, &top);
push('C', R, &top);
sum -= 90;
}
else if (sum - 50 >= 0) {
push('L', R, &top);
sum -= 50;
}
else if (sum - 40 >= 0) {
push('X', R, &top);
push('L', R, &top);
sum -= 40;
}
else if (sum - 10 >= 0) {
push('X', R, &top);
sum -= 10;
}
else if (sum - 9 >= 0) {
push('I', R, &top);
push('X', R, &top);
sum -= 9;
}
else if (sum - 5 >= 0) {
push('V', R, &top);
sum -= 5;
}
else if (sum - 4 >= 0) {
push('I', R, &top);
push('V', R, &top);
sum -= 4;
}
else {
push('I', R, &top);
--sum;
}
}
}
int main(void)
{
char R[10];
int N, sum = 0, i;
scanf("%d", &N);
for (i = 0; i < N; ++i) {
scanf("%s", R);
sum += toArabicNumerals(R);
}
if (sum > 3999) puts("ERROR");
else {
toRomanNumerals(R, sum);
puts(R);
}
return 0;
}