为什么不对
描述给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = 2 + 1, 4 = 1 + 3。
输入
共两行,第一行是数列中数的个数n ( 1 <= n <= 100),第二行是由n个不大于10000的正整数组成的数列,相邻两个整数之间用单个空格隔开。
输出
一个整数,即数列中等于其他两个数之和的数的个数。#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
int count = 0;
cin >> n;
if (n == 1 or n == 2)
{
cout << 0;
return 0;
}
vector<int> nums;
int num;
for (int i = 1; i <= n; i++)
{
cin >> num;
nums.push_back(num);
}
for (int i = 0; i < nums.size(); i++)
{
for (int j = i+1; j < nums.size(); j++)
{
for (int k = 0; k < nums.size(); k++)
{
if ((nums + nums == nums )&& (j!=k) && (k!=i))
{
count = count + 1;
}
}
}
}
cout << count;
return 0;
}为什么错了 问题出在第三个循环中,你遍历了整个数列来判断是否存在一个数等于其他两个数的和。然而,这样的做法会导致重复计数。例如,在数列1 2 3 4中,当i=0, j=1时,你会发现3=1+2,然后当i=1, j=0时,你又会发现3=2+1,这样就重复计数了。因此,你需要修改第三个循环的范围,只需遍历从i+1到n-1的数即可。
以下是修改后的代码:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
int count = 0;
cin >> n;
if (n == 1 or n == 2)
{
cout << 0;
return 0;
}
vector<int> nums;
int num;
for (int i = 1; i <= n; i++)
{
cin >> num;
nums.push_back(num);
}
for (int i = 0; i < nums.size(); i++)
{
for (int j = i+1; j < nums.size(); j++)
{
for (int k = i+2; k < nums.size(); k++)
{
if ((nums[ i] + nums == nums )&& (j!=k) && (k!=i))
{
count = count + 1;
}
}
}
}
cout << count;
return 0;
}
这样修改后,你的代码应该能够正确计算等于其他两个数之和的数的个数了。 问题出在第三层循环中,每次都需要判断k是否等于i或j,这样会导致重复计算。另外,在第二层循环中,j应该从i+1开始,因为不需要重复计算已经被计算过的组合。
正确的代码如下:
++
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
int count = 0;
cin >> n;
if (n == 1 or n == 2)
{
cout << 0;
return 0;
}
vector<int> nums;
int num;
for (int i = 1; i <= n; i++)
{
cin >> num;
nums.push_back(num);
}
for (int i = 0; i < nums.size(); i++)
{
for (int j = i + 1; j < nums.size(); j++)
{
for (int k = j + 1; k < nums.size(); k++) // 注意是从j+1开始
{
if (nums + nums == nums)
{
count++;
}
}
}
}
cout << count;
return 0;
}
此外,可以针对题目条件进行优化。如果将数列按升序排序,那么对于每个数num,只需要在比它大的数中查找是否有两个数的和等于它即可,这样可以避免重复计算。
优化后的代码如下:
++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
int count = 0;
cin >> n;
if (n == 1 or n == 2)
{
cout << 0;
return 0;
}
vector<int> nums;
int num;
for (int i = 1; i <= n; i++)
{
cin >> num;
nums.push_back(num);
}
sort(nums.begin(), nums.end()); // 排序
for (int i = nums.size() - 1; i >= 0; i--)
{
int left = 0, right = i-1; // 双指针初始化
while (left < right)
{
if (nums + nums == nums)
{
count++;
break;
}
else if (nums + nums < nums)
{
left++;
}
else
{
right--;
}
}
}
cout << count;
return 0;
}
希望这些修改能够帮助您解决问题。
球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页:
[1]