You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言复数相乘程序在线判题未通过,请求排查问题

复数乘积C程序OJ不通过问题排查与修复

题目要求

题目描述

编写一个C程序,计算两个复数的乘积。

输入格式

输入以整数N开头,随后是N对形如a + bi、c + di的复数。

输出格式

输出两个复数的乘积。

限制条件

1≤N≤20,复数的实部和虚部均为整数。

注意事项

题目包含未列出的隐藏测试用例,程序需能正确处理这些用例。

示例输入#1

3
1 + 2i, 3 - 4i
3 - 2i, 2 + 3i
9 - 2i, 3 - 2i

示例输出#1

11 + 2i
12 + 5i
23 - 24i

用户提交代码

#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);

    for (int i = 0; i < n; i++) {
        int a, b, c, d;
        char sign1, sign2;
      
        scanf("%d %c %di, %d %c %di", &a, &sign1, &b, &c, &sign2, &d);

        if (sign1 == '-')
            b = -b;
        if (sign2 == '-')
            d = -d;

        int real = (a * c) - (b * d);
        int im = (b * c) + (a * d);

        if (im < 0) {
          if(real != 0){
            printf("%d %c %di\n", real, '-', -im); }
          else {
            printf("%c %di\n", '-', -im);
        } }

        else if (im > 0){
          if(real != 0){
            printf("%d %c %di\n", real, '+', im); }
          else {
            printf("%di\n", im);
          }}

        else if (im == 0){
          if(real != 0){
            printf("%d\n", real);
          }
          else{
            printf("0\n");
          }
        }
      }
    
  
    return 0;
}

注:刚开始学习C语言,代码比较凌乱。

问题分析与修复

你的代码能通过示例用例,但OJ不接受,核心是输入处理和输出格式没覆盖所有隐藏测试场景,具体问题和修复如下:

1. 输入解析不灵活

原scanf格式强制要求虚部前有空格和符号,但隐藏用例可能出现:

  • 虚部正号省略(比如1+2i而非1 + 2i)
  • 实部/虚部本身为负数(比如-1+2i)
  • 逗号前后无空格(比如1+2i,3-4i)

修复:利用scanf自动跳过空白符的特性,直接读取带符号整数,简化输入解析:

// 替换原scanf行,兼容各种符号和空白组合
scanf("%d%di, %d%di", &a, &b, &c, &d);

%d%di会自动匹配+2i、-3i、4i等格式,无需额外处理符号。

2. 输出格式不符合要求

原代码在特殊场景下格式错误:

  • 虚部为1/-1时,会输出1i/-1i,正确格式应为i/-i
  • 实部为0且虚部为负时,会输出- xi(多空格),正确格式应为-xi

修复后的输出逻辑:

if (im != 0) {
    if (real != 0) {
        printf("%d", real);
    }
    if (im > 0) {
        if (real != 0) printf(" + ");
        if (im != 1) printf("%d", im);
        printf("i");
    } else {
        if (real != 0) printf(" - ");
        if (-im != 1) printf("%d", -im);
        printf("i");
    }
} else {
    printf("%d", real);
}
printf("\n");

完整修复代码

#include <stdio.h>

int main(void) {
    int n;
    scanf("%d", &n);

    for (int i = 0; i < n; i++) {
        int a, b, c, d;
        // 灵活解析输入,自动处理符号和空白
        scanf("%d%di, %d%di", &a, &b, &c, &d);

        int real = a * c - b * d;
        int im = b * c + a * d;

        if (im != 0) {
            if (real != 0) {
                printf("%d", real);
            }
            if (im > 0) {
                if (real != 0) {
                    printf(" + ");
                }
                if (im != 1) {
                    printf("%d", im);
                }
                printf("i");
            } else {
                if (real != 0) {
                    printf(" - ");
                }
                if (-im != 1) {
                    printf("%d", -im);
                }
                printf("i");
            }
        } else {
            printf("%d", real);
        }
        printf("\n");
    }

    return 0;
}

覆盖测试场景

  • 虚部为1:输入1+1i,1+1i → 输出0 + 2i
  • 虚部为-1:输入1-1i,1-1i → 输出0 - 2i
  • 实部为0:输入0+1i,0+1i → 输出-1
  • 无空格输入:输入1+2i,3-4i → 输出11 + 2i

内容的提问来源于stack exchange,提问作者Sebastian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 11:01:38