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

如何统计数组中数对和存在于数组的不同和数量?

问题解决:统计不同的有效数对和数量

你的代码当前会统计所有符合条件的数对出现次数,但题目要求的是统计满足「两数之和存在于数组中」的不同和的数量,比如输入1 3 4 5 2 2时,正确结果是3而非7。

修改后的代码

#include<stdio.h>

int main(){
    int n, n2, num[201];
    // 用数组标记已统计过的和,假设元素最大为200,和最大为400,可按需调整范围
    int seen_sum[401] = {0};
    
    scanf("%d", &n);
    for(int i = 1; i <= n; i++){
        int count = 0;
        // 每个测试用例开始前重置标记数组
        for(int s = 0; s <= 400; s++){
            seen_sum[s] = 0;
        }
        
        scanf("%d", &n2);
        for(int j = 0; j < n2; j++){
            scanf("%d", &num[j]);
        }
        
        for(int j = 0; j < n2; j++){
            for(int k = j + 1; k < n2; k++){
                int sum = num[j] + num[k];
                // 检查这个和是否存在于数组中
                int sum_exists = 0;
                for(int l = 0; l < n2; l++){
                    if(num[l] == sum){
                        sum_exists = 1;
                        break; // 找到就停止查找,节省时间
                    }
                }
                // 只有和存在且未被统计过,才计数并标记
                if(sum_exists && !seen_sum[sum]){
                    count++;
                    seen_sum[sum] = 1;
                }
            }
        }
        
        printf("%d\n", count);
    }
    
    return 0;
}

核心改动点

  • 新增标记数组seen_sum:用来记录已经被计数过的和,避免重复统计同一个和。数组大小根据输入元素的可能范围设定,这里假设元素最大为200,所以和的最大值是400。
  • 重置标记数组:每个测试用例开始时,把seen_sum数组重置为0,保证不同测试用例之间不会互相干扰。
  • 优化查找逻辑:计算数对和后,检查该和是否存在于数组中,找到后立即退出循环,提升运行效率。
  • 调整计数规则:只有当和存在于数组中,并且这个和还没被统计过的时候,才增加计数,并把该和标记为已统计。
  • 移除多余的getchar():scanf读取整数时会自动跳过空格、换行等空白字符,不需要额外用getchar()处理,否则可能因输入格式问题导致错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:35:40