Пифагорейские тройни, чья сумма равна 1000?

Задача проекта Эйлера 9. Я попытался ее решить. На самом деле я получаю триплеты, которые не являются пифагорейскими триплетами, и их сумма равна 1000. Почему? Я удостоверился, что это были пифагорейские тройки. Вот мой длинный и не очень оптимизированный код:

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
int a,b,c; //Decalring the triplets...
a=1; //First triplet starts with 3
b=1;
int c2;//c square

while(true)
{
for(b=1;b<a;b++){
c2 = a*a+b*b;
c = sqrt(c2);
if(c*c == c2 && a+b+c==1000)
{
cout<<a<<","<<b<<","<<c<<"\n";
}
a++;
}
b++;
}
}

Окончательный рабочий код:

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
int x,y,z,a;
for(x=1;x<=1000;x++)
{
for(y=1;y<=1000;y++)
{
a = x*x+y*y;
z=sqrt(a);
if(z*z==a && x+y+z==1000 && x<y){
cout<<x<<","<<y<<","<<z<<"."<<"\n";
cout<<"So the product of all of the three triplets is "<<x*y*z;
}
}
}
return 0;
}

1

Решение

Ваши условия петли выключены. c соответствует текущему a а также b вычисляется внутри петля. Следовательно, вы не можете проверить итерацию цикла на значении c потому что это старый. Удалить c исходя из условий, поставьте обратно тест на целостность sqrt(c2)и у вас есть решение.

РЕДАКТИРОВАТЬ

Вы, кажется, пытаетесь получить результаты, делая более или менее случайные изменения кода. То есть не не собираюсь никуда тебя доставать.

Начните с четкой формулировки вашего алгоритма на простом человеческом языке. Затем перефразируйте его в (все еще простой человеческий язык) структуру, соответствующую понятиям кода C ++. Затем закодируйте эти понятия.

Что-то вроде этого:

Шаг 1. В пифагорейской тройке третий член c полностью определяется первыми двумя. Поэтому я рассмотрю все возможные значения a а также bи, если они образуют пифагорейский триплет, проверьте его на сумму 1000.

Шаг 2. Для каждого aЯ все опробую bбольше чем a такой, что a + b меньше 1000. Я вычислю c2 и посмотреть, если это квадрат. Если это так, я проверю сумму триплета.

Шаг 3.

#include <cmath>
#include <iostream>

int main()
{
for (int a = 3; a < 1000; ++a) {
for (int b = a + 1; a + b < 1000; ++b) {
int c2 = a * a + b * b;
int c = std::sqrt(c2);
if (c * c == c2) {
if (a + b + c == 1000) {
std::cout << "Found triplet " << a << ", " << b << ", " << c << '\n';
}
}
}
}
}
2

Другие решения

Вы должны проверить, чтобы убедиться, что c2 на самом деле квадрат. Один из способов сделать это — проверить, c*c == c2 после того, как вы взяли квадратный корень.

1

//My brute force solution works fine
since i<j<k
start j loop from i+1 and k loop from j+1
whenever the condition satisfies print the product of triplet

#include<iostream>
using namespace std;
int main()
{
for(long long i=1;i<=1000;i++)
{
for(long long j=i+1;j<=1000;j++)
{
for(long long k=j+1;k<=1000;k++)
{
if((i+j+k)==1000 && i*i+j*j==k*k)
{
cout<<i*j*k<<endl;
}
}
}
}
}
1
По вопросам рекламы [email protected]