鱼C论坛

 找回密码
 立即注册
查看: 1098|回复: 2

为什么不对

[复制链接]
发表于 2023-10-31 17:11:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
描述
给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列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[i] + nums[j] == nums[k] )&& (j!=k) && (k!=i))
                                {
                                        count = count + 1;
                                }
                        }
                }
        }
        cout << count;
        return 0;
}为什么错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[j] == nums[k] )&& (j!=k) && (k!=i))
                {
                    count = count + 1;
                }
            }
        }
    }
    cout << count;
    return 0;
}
这样修改后,你的代码应该能够正确计算等于其他两个数之和的数的个数了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2023-10-31 17:13:18 | 显示全部楼层
问题出在第三层循环中,每次都需要判断k是否等于ij,这样会导致重复计算。另外,在第二层循环中,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[i] + nums[j] == nums[k])                {                    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[left] + nums[right] == nums[i])            {                count++;                break;            }            else if (nums[left] + nums[right] < nums[i])            {                left++;            }            else            {                right--;            }        }    }    cout << count;    return 0;}
希望这些修改能够帮助您解决问题。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 15:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表