我正在努力学习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;
}
1条答案
按热度按时间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;
可以解决这个问题。(还可以进行优化以避免冗余检查。)