题目

攻克点
- 如何确定数组中两数相加的和是否存在于这个数组中
- 如何求出遍历循环的范围
- 由说明可知,两组数若相加起来答案相同,只记一次,需要一个方法去重
- 如何计数
原理
确定数组中两数相加的和是否存在于这个数组中
- 建立一个数组,用for循环输入所需数据
- 再建立一个布尔型数组,利用数组嵌套,使这个数组中该数数值与其位置相绑定,例如
a[5]=3,定义g[a[5]]=1,即表示g[3]=1,即数组中存在3这个数字 - 核心就是用数组的个数来代表其数值
求出遍历循环的范围
- 求所有可能的两个数相加的结果出现的次数,而这个结果的范围是从最小的两数之和到最大的两数之和
- 所以只需要求出最大值即可,循环范围小于最大值
求和并去重
- 再定义一个数组,计算数组中两数相加,即利用循环计算
a[i] + a[j],然后利用数组嵌套,如t[a[i] + a[j]],每计算一次,将其结果+1 - 例如
a[1]=3,a[2]=4,t[a[1]+a[2]]=t[7],t[7]++ a[3]=4,a[2]=4,t[a[1]+a[2]]=t[7],t[7]++- 定义数组中初始都为0,两个数相加结果为x,则
t[x]必>=1
如何计数
- 由上可知,只需
t[i] > 0 && g[i]==1,即表示其和存在,定义变量,遍历数组t,每符合一次上述情况,结果加一 - 在t[i]中的i,只会出现一次,且重复的次数会在
t[i]的值中体现,所以能达到去重的效果
代码分析
确定数组中两数相加的和是否存在于这个数组中,利用循环和数组嵌套
for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); g[a[i]] = 1; }即如果
g[x]=1,则x存在于原数组a中定义maxn,利用循环遍历找出两数相加的最大值
maxn = 0; // 初始化 maxn for (int i = 1; i < n; i++) { // 暴力枚举求出可以加出的数 for (int j = i + 1; j <= n; j++) { if (a[i] + a[j] > maxn) { maxn = a[i] + a[j]; // 求出数中最大值 } } }建立数组t,存储
a[i] + a[j]值出现的次数for (int i = 1; i < n; i++) { // 暴力枚举求出可以加出的数 for (int j = i + 1; j <= n; j++) { t[a[i] + a[j]]++; // a[i]+a[j]这个数被加出来了 } }定义变量,用来存储重复的次数
ans = 0; // 初始化 ans for (int i = 1; i <= maxn; i++) { // 只需要枚举到最大值即可 if (t[i] > 0 && g[i]) ans++; // 判断是否满足,满足就 ans++ }打印结果
printf("%d\n", ans);
完整代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int M = 20005; // 20005由于最大值是10000+10000=20000,const int是静态定义,定义后该值(即M)无法修改。
int t[M], g[M]; // t是桶,t[i]表示值为i的数在集合中两两相加出现了几次,g[i]表示值为i的数是否在原集合中,1为在,0为不在
int n, a[105], ans, maxn; // a数组开105是由于总共最多100个数
int main()
{
scanf("%d", &n);
memset(g, 0, sizeof(g)); // 初始化 g 数组
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]); // 读入
g[a[i]] = 1; // 在集合中赋值为1
}
memset(t, 0, sizeof(t)); // 初始化 t 数组
maxn = 0; // 初始化 maxn
for (int i = 1; i < n; i++)
{ // 暴力枚举求出可以加出的数
for (int j = i + 1; j <= n; j++)
{
t[a[i] + a[j]]++; // a[i]+a[j]这个数被加出来了
if (a[i] + a[j] > maxn)
{
maxn = a[i] + a[j]; // 求出数中最大值
}
}
}
ans = 0; // 初始化 ans
for (int i = 1; i <= maxn; i++)
{ // 只需要枚举到最大值即可
if (t[i] > 0 && g[i])
ans++; // 判断是否满足,满足就 ans++
}
printf("%d\n", ans);
return 0;
}
20 条评论
2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!
1
演员
封魔纪之赤雷传
我的防疫伙伴
山狗
霹雳玫瑰
马耳他
编号17
好人寥寥
罗斯坎普黑手党和英国
谈判专家交渉人
人间一天
猎杀u571
火山法卡里营救
古巴音缘
哈哈哈,写的太好了https://www.lawjida.com/
《恋慕》韩国剧高清在线免费观看:https://www.jgz518.com/xingkong/57108.html
看到你的文章,我仿佛感受到了生活中的美好。 https://www.yonboz.com/video/69089.html