如何统计数组中数对和存在于数组的不同和数量?
问题解决:统计不同的有效数对和数量
你的代码当前会统计所有符合条件的数对出现次数,但题目要求的是统计满足「两数之和存在于数组中」的不同和的数量,比如输入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
相关产品推荐
相关产品推荐

