有关这个蓝桥杯的题,想问一下我这个代码错在哪里。
这是我的代码,问过AI之后没看懂。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int F(char ch)
{
if(ch == 'I')
{
return 1;
}
else if(ch == 'V')
{
return 5;
}
else if(ch == 'X')
{
return 10;
}
else if(ch == 'L')
{
return 50;
}
else if(ch == 'C')
{
return 100;
}
else if(ch == 'D')
{
return 500;
}
else if(ch == 'M')
{
return 1000;
}
}
int main(int argc, char *argv[])
{
int n = 0;
scanf("%d", &n);
getchar();
int sum[100] = {0};
int i = 0;
for(i = 0; i < n; i++)
{
char a[100] = {0};
fgets(a, sizeof(a), stdin);
a[strcspn(a, "\n")] = 0;
int len = strlen(a);
int j = 0;
for(j = 0; j < len - 1; j++)
{
if(F(a[j+1]) > F(a[j]))
{
sum[i] += F(a[j+1]) - F(a[j]);
}
else
{
sum[i] += F(a[j]);
}
}
}
for(i = 0; i < n; i++)
{
printf("%d\n", sum[i]);
}
return 0;
}
大佬你的代码主要存在两个问题:
最后一个字符未被累加在你的内层循环 for(j = 0; j < len - 1; j++) 里面,循环只处理到了倒数第二个字符(j < len - 1)。如果最后一个字符不满足 “前小后大” 的减法规则,它的值就会被遗漏,没有加到 sum[i] 里面。减法规则处理逻辑有小问题,当你发现 F(a[j+1]) > F(a[j]) 时,你直接将 F(a[j+1]) - F(a[j]) 加到了总和里,但这会导致 j 和 j+1 两个字符被一次性处理。然而,循环的下一次迭代会让 j 自增,导致 j+1 这个字符又被当作当前字符重新处理了一遍,造成了重复计算。