第一种方法(但noj会显示超时)
原因是noj不以输入回车结束从而无法结束循环而导致超时
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() { //数学方法
char a, last_a='-';
int pri=-1, last_pri = -1;
int sum = 0;
while ((a = getchar())!='\n') {
if (a=='I') {
pri = 1;
} else if(a=='V') {
pri = 5;
} else if (a=='X') {
pri = 10;
}
if (last_pri==-1) { //第一次不做比较
last_a = a;
last_pri = pri;
sum = pri;
continue;
}
if (pri>last_pri) {
sum=pri-sum;
} else {
sum+=pri;
}
}
printf("%d",sum);
return 0;
}
第二种(用到了string.h库函数,因为上述原因同样noj无法通过)
/*int main()
{
char a[10];
int i=0;
while((a[i]=getchar())!='\n')
{
i++;
}
a[i]='\0';//此时的字符串a最后一位为\0,否则为'\n'
if(!strcmp(a,"I"))
printf("%d",1);
else if(!strcmp(a,"II"))
printf("%d",2);
else if(!strcmp(a,"III"))
printf("%d",3);
else if(!strcmp(a,"IV"))
printf("%d",4);
else if(!strcmp(a,"V"))
printf("%d",5);
else if(!strcmp(a,"VI"))
printf("%d",6);
else if(!strcmp(a,"VII"))
printf("%d",7);
else if(!strcmp(a,"VIII"))
printf("%d",8);
else if(!strcmp(a,"IX"))
printf("%d",9);
else if(!strcmp(a,"X"))
printf("%d",10);
else if(!strcmp(a,"XI"))
printf("%d",11);
else if(!strcmp(a,"XII"))
printf("%d",12);
return 0;
}*/
可以将其中while循环部分改为:
while(1)
{
a=getchar();
if(a!='X'&&a!='I'&&a!='V')
break;
.....................................//再用第一种方法的逻辑进行运算
}
第三种(,先输入整个字符串再遍历每一个输入的字符,noj可以通过)
/*#include <stdio.h>
#include <string.h>
int main()
{
int sum;
int x,y=-1;
int len;
char a[20];
scanf("%s", a);//%s是打印字符串的意思
len = strlen(a);
for (int i=0; i<len; i++)
{
if(a[i]=='I')
x=1;
else if(a[i]=='V')
x=5;
else if(a[i]=='X')
x=10;
if(y==-1)
{
sum=x;
y=x;
continue;
}
if(x>y)
sum=x-sum;
else
sum=x+sum;
}
printf("%d",sum);
}*/