結果

問題 No.518 ローマ数字の和
ユーザー YamyukiYamyuki
提出日時 2017-05-28 22:53:43
言語 C90
(gcc 11.4.0)
結果
AC  
実行時間 1 ms / 2,000 ms
コード長 1,445 bytes
コンパイル時間 198 ms
コンパイル使用メモリ 22,664 KB
実行使用メモリ 4,348 KB
最終ジャッジ日時 2023-10-21 14:28:42
合計ジャッジ時間 1,027 ms
ジャッジサーバーID
(参考情報)
judge15 / judge13
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 0 ms
4,348 KB
testcase_01 AC 0 ms
4,348 KB
testcase_02 AC 0 ms
4,348 KB
testcase_03 AC 0 ms
4,348 KB
testcase_04 AC 1 ms
4,348 KB
testcase_05 AC 1 ms
4,348 KB
testcase_06 AC 1 ms
4,348 KB
testcase_07 AC 0 ms
4,348 KB
testcase_08 AC 0 ms
4,348 KB
testcase_09 AC 0 ms
4,348 KB
testcase_10 AC 1 ms
4,348 KB
testcase_11 AC 1 ms
4,348 KB
testcase_12 AC 0 ms
4,348 KB
testcase_13 AC 1 ms
4,348 KB
testcase_14 AC 0 ms
4,348 KB
testcase_15 AC 1 ms
4,348 KB
testcase_16 AC 0 ms
4,348 KB
testcase_17 AC 0 ms
4,348 KB
testcase_18 AC 0 ms
4,348 KB
testcase_19 AC 0 ms
4,348 KB
testcase_20 AC 0 ms
4,348 KB
testcase_21 AC 1 ms
4,348 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.c:3:5: warning: conflicting types for built-in function ‘strlen’; expected ‘long unsigned int(const char *)’ [-Wbuiltin-declaration-mismatch]
    3 | int strlen(char *s){
      |     ^~~~~~
main.c:2:1: note: ‘strlen’ is declared in header ‘<string.h>’
    1 | #include<stdio.h>
  +++ |+#include <string.h>
    2 | 
main.c: In function ‘main’:
main.c:69:9: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   69 |         scanf("%d",&n);
      |         ^~~~~~~~~~~~~~

ソースコード

diff #

#include<stdio.h>

int strlen(char *s){
	int i=0;
	while(s[i]!='\0'){i++;}
	return i;
}

int convert(char s){
	switch (s) {
		case 'I':
		return 1;
		case 'V':
		return 5;
		case 'X':
		return 10;
		case 'L':
		return 50;
		case 'C':
		return 100;
		case 'D':
		return 500;
		case 'M':
		return 1000;
	}
	return 0;
}

void construct(int a,char m1,char m2,char m3){
	char s[5];
	int i=0;
	switch(a){
		case 3:
		s[i]=m1;
		i++;
		case 2:
		s[i]=m1;
		i++;
		case 1:
		s[i]=m1;
		s[i+1]='\0';
		printf("%s",s);
		return;
		case 4:
		printf("%c%c",m1,m2);
		return;
		case 5:
		case 6:
		case 7:
		case 8:
		s[0]=m2;
		for(i=0;i<a-5;i++){
			s[i+1]=m1;
		}
		s[a-4]='\0';
		printf("%s",s);
		return;
		case 9:
		printf("%c%c",m1,m3);
		return;
		case 0:
		return;
	}
}

int main(int argc, char const *argv[]){
	char r[22];
	int n,a=0,c,i,p,l,d,b[4];
	scanf("%d",&n);
	getchar();
	while(n>0){
		i=0;
		r[0]=getchar();
		while(r[i]!=' ' && r[i]!='\n'){
			i++;
			r[i]=getchar();
		}
		l=i;
		p=0;
		c=0;
		for(i=l-1;i>=0;i--){
			c=convert(r[i]);
			d=0;
			while(i-d-1>=0 && r[i]==r[i-d-1]){
				d++;
			}
			if(p!=0 && p>c){
				a-=c*(d+1);
			}else{
				a+=c*(d+1);
			}
			p=c;
			i-=d;
		}
		if(a>3999){
			printf("ERROR\n");
			return 0;
		}
		n--;
	}
	for(i=0;i<4;i++){
		b[i]=a%10;
		a/=10;
	}
	construct(b[3],'M','?','?');
	construct(b[2],'C','D','M');
	construct(b[1],'X','L','C');
	construct(b[0],'I','V','X');
	printf("\n");
	return 0;
}
0