c++ 如何从向量中找到非勾股三元组?

31moq8wy  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(162)

我正在努力学习c++并完成一个学习任务:
这就是任务:
毕达哥拉斯三元组是一组三个整数a、B和c,其中a^2 + b^2 = c^2成立。写一个函数,它接受一个std::vector作为输入,并返回一个std::vector,其中所有的勾股三元组都被删除了。例如,给定一个由{6,25,5,3,7,24,4,23}组成的输入,函数应该返回{6,23},因为3^2 + 4^2 = 5^2和7^2 + 24^2 = 25^2是毕达哥拉斯三元组。
我在获取输出时遇到麻烦{6,23}
这是我目前为止的代码。

#include <iostream>
#include <vector>
#include <cmath>

bool isPythagorasTriplet(int a, int b, int c)
{
    if (pow(a, 2) + pow(b, 2) == pow(c, 2)){
        return true;
    } else return false;
}

std::vector<int> pythagorasTriplet(std::vector<int> input)
{
    std::vector<int> notTriplets;
    bool isTriplets = false;

    for (int i = 0; i < input.size(); i++){
        isTriplets = false;

        for (int j = 0; j < input.size(); j++){

            for (int k = 0; k < input.size(); k++){

                if (i == j || i == k || j == k){
                    continue;}
                    
                    if (isPythagorasTriplet(input[i], input[j], input[k])){
                        isTriplets = true;
                        // notTriplets.push_back(input[i]);
                        // notTriplets.push_back(input[j]);
                        // notTriplets.push_back(input[k]);
                        

                    }
                
            }
        }
        if (isTriplets == false) notTriplets.push_back(input[i]);
        
    } 

    return notTriplets;
}

int main()
{
    std::vector<int> input = {6, 25, 5, 3, 7, 24, 4, 23};

    std::vector<int> noTriplets = pythagorasTriplet(input);

    for (int i = 0; i < noTriplets.size(); i++){
        std::cout << noTriplets[i] << std::endl;
    }

    return 0;
}
dw1jzc5e

dw1jzc5e1#

您的代码应该找到列表中的每个数字,这些数字不与列表中的任何其他数字形成勾股三元组。然而,当评估是否在列表中包含input[i]时,它只评估input[i]是否在传递给isPythagorusTriplet的第一个位置与其他两个数字形成毕达哥拉斯三元组。因此,它忽略了input[i]是勾股三角形斜边的情况。
isPythagorusTriplet的主体更改为return a*a + b*b == c*c || b*b + c*c == a*a || c*c + a*a == b*b;可以解决这个问题。(还可以进行优化以避免冗余检查。)

相关问题