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
相关产品推荐
相关产品推荐

