本题难点在于每个和的数只能被记录一次,因此需判断是否有不同的两个值相加相等。
两个思路
1.再建立一个数组,当符合条件时载入数组,载入之前遍历数组是否已有这个值
2.建立结构体数组,直接给每个成员多加一个判断数值,若符合条件则将判断数值修改
//写法一
int main()
{
int n;
int arr[20000] = { 0 }, tmp = 0;//别问我20000哪来的,问就是试出来的
int* p;
cin >> n;
p = new int[n];for (int i = 0; i < n; i++)
{
cin >> p[i];
}
//暴力遍历每个数,并把每个符合条件的数载入数组arr
for (int i = 0; i < n - 1; i++)
{
for (int k = i + 1; k < n; k++)
{
for (int j=0 ;j < n; j++)
{
if (p[i] + p[k] == p[j])
{
arr[tmp++] = p[j];
}
}
}
}//遍历arr,统计其不相同的数
int arr2 = 0;
for (int i = 0; i < 20000; i++)
{
int tmp2 = arr[i];
if (tmp2 != -2 && tmp2 != 0) arr2++;
for (int k = i; k < 20000; k++)
{
if (arr[k] == tmp2)
{
arr[k] = -2;//将相同的数 改为不存在的-2,并以此作为
}
}
}cout << arr2;
return 0;
}
//写法2
struct shu
{
int num;
int ta = 0;.//用于标志是否被计数
};int main()
{
int n,cnt=0;
cin >> n;
shu* p = new shu[n];
for (int i = 0; i < n; i++)
{
cin >> p[i].num;
}
for (int i = 0; i < n-1; i++)
{
for (int k = i + 1; k < n; k++)
{
for (int j = 0; j < n; j++)
{
if (p[i].num + p[k].num == p[j]. num)
{
p[j].ta = 1;.//最重要的区别就在这。将每个符合条件的成员标志都改为1
}
}
}
}
for (int i = 0; i < n; i++)
{
cnt += p[i].ta;//直接相加就可以求得总过有多少个数符合条件
}
cout << cnt << endl;
return 0;
};