C语言多测试用例程序中sum变量累加历史值的问题排查
多测试用例下奇数和计算结果累加错误的解决方法
你的程序出现结果错误的核心原因是sum变量的初始化时机不对——sum被定义在main函数开头,仅在程序启动时初始化为0,后续每个测试用例的计算都会在之前的sum值基础上累加,导致每次输出的是历史结果与当前用例结果的总和(运行时终端显示程序在打印前会将sum的历史值与新值累加)。
解决方法
有两种简单的修复方式:
方式一:每次测试用例开始前重置sum
在每个测试用例的循环体内,读取x和y之前,将sum重置为0:
#include <stdio.h> #include <stdlib.h> int main() { int testcase, sum; scanf("%d", &testcase); for (int i=0; i<testcase; i++) { sum = 0; // 每次测试用例开始时重置sum int x,y; scanf("%d %d", &x, &y); if (x>y) { for (int j=y+1; j<=x-1; j++) // 避免内层循环变量与外层重复,替换为j { if (j%2!=0) { sum += j; } } printf("%d\n", sum); } else { for (int j=x+1; j<=y-1; j++) { if (j%2!=0) { sum += j; } } printf("%d\n", sum); } } return 0; }
注意:原代码内层循环使用了和外层循环相同的变量名
i,会导致外层循环的i被内层覆盖,虽不影响当前功能,但属于不良编码习惯,建议替换为不同变量名(如j)。
方式二:将sum定义在测试用例循环内部
把sum的声明移到循环体内,每次循环都会重新初始化:
#include <stdio.h> #include <stdlib.h> int main() { int testcase; scanf("%d", &testcase); for (int i=0; i<testcase; i++) { int x,y, sum=0; // sum在每次循环时重新初始化 scanf("%d %d", &x, &y); if (x>y) { for (int j=y+1; j<=x-1; j++) { if (j%2!=0) { sum += j; } } printf("%d\n", sum); } else { for (int j=x+1; j<=y-1; j++) { if (j%2!=0) { sum += j; } } printf("%d\n", sum); } } return 0; }
额外优化:用数学公式替代循环(更高效)
不需要遍历区间内的每个数,利用等差数列求和公式可直接计算结果,大幅提升效率(尤其是区间很大时):
- 确定区间左右边界:
left = min(x,y) + 1,right = max(x,y) - 1 - 若
left > right,区间内无数字,和为0 - 找到区间内第一个奇数
first:left为奇数则取left,否则取left+1 - 找到区间内最后一个奇数
last:right为奇数则取right,否则取right-1 - 若
first > last,和为0;否则项数count = (last - first)/2 + 1,和为count * (first + last) / 2
修改后的代码:
#include <stdio.h> #include <stdlib.h> int main() { int testcase; scanf("%d", &testcase); for (int i=0; i<testcase; i++) { int x,y; scanf("%d %d", &x, &y); int left = (x < y) ? x + 1 : y + 1; int right = (x > y) ? x - 1 : y - 1; if (left > right) { printf("0\n"); continue; } // 计算第一个奇数 int first = (left % 2 != 0) ? left : left + 1; // 计算最后一个奇数 int last = (right % 2 != 0) ? right : right - 1; if (first > last) { printf("0\n"); } else { int count = (last - first)/2 + 1; int sum = count * (first + last) / 2; printf("%d\n", sum); } } return 0; }
内容的提问来源于stack exchange,提问作者Didar004
相关产品推荐
相关产品推荐

