黎子卿 发表于 2023-10-31 17:11:50

为什么不对

描述
给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列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;
}为什么错了

isdkz 发表于 2023-10-31 17:12:25

问题出在第三个循环中,你遍历了整个数列来判断是否存在一个数等于其他两个数的和。然而,这样的做法会导致重复计数。例如,在数列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;
}

这样修改后,你的代码应该能够正确计算等于其他两个数之和的数的个数了。

Mike_python小 发表于 2023-10-31 17:13:18

问题出在第三层循环中,每次都需要判断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]
查看完整版本: 为什么不对