結果

問題 No.518 ローマ数字の和
ユーザー Mcpu3Mcpu3
提出日時 2018-10-24 23:22:19
言語 C
(gcc 12.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
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 AC 1 ms
5,248 KB
testcase_02 AC 1 ms
5,248 KB
testcase_03 AC 1 ms
5,248 KB
testcase_04 AC 1 ms
5,248 KB
testcase_05 AC 1 ms
5,248 KB
testcase_06 AC 1 ms
5,248 KB
testcase_07 AC 1 ms
5,248 KB
testcase_08 AC 1 ms
5,248 KB
testcase_09 AC 1 ms
5,248 KB
testcase_10 AC 1 ms
5,248 KB
testcase_11 AC 1 ms
5,248 KB
testcase_12 AC 1 ms
5,248 KB
testcase_13 AC 1 ms
5,248 KB
testcase_14 AC 1 ms
5,248 KB
testcase_15 AC 1 ms
5,248 KB
testcase_16 AC 1 ms
5,248 KB
testcase_17 AC 1 ms
5,248 KB
testcase_18 AC 1 ms
5,248 KB
testcase_19 AC 1 ms
5,248 KB
testcase_20 AC 1 ms
5,248 KB
testcase_21 AC 1 ms
5,248 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#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;
}
0