2013-04-19 3 views
0

Проект Эйлера проблема 9. Я попытался решить эту проблему, на самом деле я получаю тройки, которые не являются пифагорейскими триплетами, а их сумма равна 1000. Почему? Я убедился, что это пифагорейские триплеты. Вот мой длинный и не очень оптимизированный код:Пифагорейские триплеты, чья сумма составляет 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; 
} 
+0

Если вы не проверять, что 'SQRT (c2)' является неотъемлемой частью? – Angew

+0

Я сделал, это не дает мне результата ...:/ –

ответ

1

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

+0

Спасибо, я попробовал, но это не дает мне результата:/ Возможно, что-то не так с моей логикой? –

+0

@Rohanchrome: Условие петли на самой внешней петле выглядит подозрительно. 'a' и' c' будут меняться в ответ на 'b' в цикле, поэтому вам, вероятно, следует проверять' b' только условие цикла while. – hammar

+0

Какое должно быть условие? б <= 1000? –

2

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

EDIT

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

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

Нечто подобное:

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

Шаг 2. Для каждого a, я испытаю все b S больше, чем 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'; 
     } 
     } 
    } 
    } 
} 
+0

Обновлено сообщение, но триплеты не отображаются:/ –

+0

@Rohanchrome Ну, теперь вы проверяете только триплеты, где 'b == a + 1' , Вы должны также закорачивать 'b'. – Angew

+0

Извините, обновил сообщение с двумя циклами, Тот же результат:/ –

-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; 
       } 
      } 
     } 
    } 
} 
+0

Некоторые считают, что это плохой стиль, чтобы ответить без раскопок и текст без объяснения. –