蓝桥杯罗马数字转换代码错误排查:我的C语言实现哪里出错了?

新手上路,请多包涵

有关这个蓝桥杯的题,想问一下我这个代码错在哪里。
这是题目
题目

这是我的代码,问过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;
}
阅读 676
1 个回答

大佬你的代码主要存在两个问题:
最后一个字符未被累加在你的内层循环 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 这个字符又被当作当前字符重新处理了一遍,造成了重复计算。

#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;
    return 0; // 处理非法字符
}

int main(int argc, char *argv[])
{
    int n = 0;
    scanf("%d", &n);
    getchar(); // 吸收换行符

    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 total = 0;
        int j = 0;

        for(j = 0; j < len; j++)
        {
            // 如果不是最后一个字符,且下一个字符值更大,则做减法
            if(j < len - 1 && F(a[j+1]) > F(a[j]))
            {
                total -= F(a[j]);
            }
            else
            {
                total += F(a[j]);
            }
        }

        printf("%d\n", total);
    }
    return 0;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进