C语言前缀和实现数组区间求和查询,测试4报错求排查
问题描述
单测试用例时间限制: 1.5秒
内存限制: 256MB
输入: 标准输入
输出: 标准输出
给定两个整数N和Q,一个包含N个元素的数组A,以及Q组查询对(L, R)。对于每组查询,输出数组A中从索引L到R的所有元素之和。
输入格式
- 第一行包含两个整数N、Q(1≤N,Q≤10^5),其中N是数组A的元素个数,Q是查询对的数量。
- 第二行包含N个整数(1 ≤ A_i ≤ 10^9)。
- 接下来Q行,每行包含两个整数L、R(1 ≤ L ≤ R ≤ N)。
输出格式
对于每组查询,输出一行,包含数组A中索引L到R的元素之和。
示例
示例1
输入
6 3 6 4 2 7 2 7 1 3 3 6 1 6
输出
12 18 28
示例2
输入
4 3 5 5 2 3 1 3 2 3 1 4
输出
12 7 15
我的代码
#include <stdio.h> #include <stdlib.h> int main() { int n, q; scanf("%d %d", &n, &q); long long int sum[100001]; for (int i = 0; i < n; i++) { long long int num; scanf("%lld", &num); if (i == 0) { sum[i] = num; } else { sum[i] = sum[i-1] + num; } } for (int j = 0; j < q; j++) { int l,r; scanf("%d %d", &l, &r); if (l == 1) { printf("%d\n", sum[r - 1]); } else { printf("%d\n", sum[r - 1] - sum[l - 2]); } } return 0; }
解题思路
定义前缀和数组sum,第一个循环逐个读取数组元素并累加存储到sum数组中。第二个循环读取查询的区间范围,计算并输出区间和:若L为1,则直接取sum[r-1];否则用sum[r-1]减去sum[l-2]得到区间和。
算法示例解释
输入:
6 1 6 4 2 7 2 7 3 6
解释: sum[0] = 6, sum[1] = 10, sum[2] = 12, sum[3] = 19, sum[4] = 21, sum[5] = 28 区间和为 ( sum[6 - 1] - sum[3 - 2] ) = ( sum[5] - sum[1] ) = 28 - 10 = 18 = 2+7+2+7
错误原因分析
代码中存在格式符不匹配的问题:
sum数组是long long int类型,计算得到的区间和也是long long int类型,但输出时使用了%d格式符(仅适用于int类型)。- 当数值超过
int的范围(比如总和达到1e14,远大于int的最大取值2^31-1)时,%d会导致数据截断或格式错误,从而触发Wrong Answer。
修正方案
将输出语句中的%d替换为%lld:
if (l == 1) { printf("%lld\n", sum[r - 1]); } else { printf("%lld\n", sum[r - 1] - sum[l - 2]); }
内容的提问来源于stack exchange,提问作者Didar004
相关产品推荐
相关产品推荐

