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

C语言前缀和实现数组区间求和查询,测试4报错求排查

问题描述

单测试用例时间限制: 1.5秒
内存限制: 256MB
输入: 标准输入
输出: 标准输出

给定两个整数N和Q,一个包含N个元素的数组A,以及Q组查询对(L, R)。对于每组查询,输出数组A中从索引L到R的所有元素之和。

输入格式

  1. 第一行包含两个整数N、Q(1≤N,Q≤10^5),其中N是数组A的元素个数,Q是查询对的数量。
  2. 第二行包含N个整数(1 ≤ A_i ≤ 10^9)。
  3. 接下来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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 08:06:03