2015-05-19 2 views
0

Проблема заключается в том:Проект Эйлера 9 Решение не дает правильный результат

пифагорейцем триплет представляет собой набор из трех натуральных чисел, в < б < с, , для которого,

а^2 + b^2 = c^2 Например, 3^2 + 4^2 = 9 + 16 = 25 = 5^2.

Существует ровно один пифагорейский триплет, для которого a + b + c = 1000. Найти продукт abc.

Таким образом, используя функцию tripletP() Я думаю, что программа генерирует все возможные комбинации из 3 сумматоров для числа 1000. и функции isTriplet (а, б, в) в этом коде, никогда не возвращает истины и значение int продукта равно 0 в конце. Я не могу найти недостаток в своей логике, любая помощь будет оценена.

Вот мой Java класс с кодом, который я думал, что позволит решить проблему 9:

public class ProblemNine { 


    public static void main(String[] args) { 

     ProblemNine f = new ProblemNine(); 
     System.out.println(f.tripletP()); 

    } 

    boolean isTriplet(int a, int b, int c){ 

     if((a*a)+(b*b)==(c*c)){ 
      return true; 
     } else return false;  
    } 

    int tripletP(){ 
     int a=1,b=2,c=997; 
     int product = 0; 

     //outerloop generates all possible combinations of 3 summators for the number 1000, if b>c>a is true 
     outerloop: 
     for(int i = 997; i>499; i--){ 
      c = i; 
      b = 999-i; 
      a = 1; 

      while(b>(a+2) && (a+b) == (1000-i) && a!=b && c>b){ 
       b--; 
       a++; 
       // supposedly checks if a,b,c are a triplet. 
       if (isTriplet(a,b,c)){ 
        product=a*b*c; 
        break outerloop; 
       } 
      } 

      if(c>997 || b>499 || a>249){ 
       break outerloop; 
      } 
     } 

     return product; 
    } 

} 
+0

'Math.pow()' использует арифметику с плавающей запятой, поэтому вы не можете безопасно сравнивать результаты, так как могут быть небольшие различия. Просто используйте 'a * a' для квадратов ints. –

+0

'Math.pow' действительно дорогой и более подробный, чем' a * a' –

+0

В моих других попытках я использовал a * a, и результат был таким же. – Stabbz

ответ

2
for(int i = 997; i>499; i--){ 

Вы тормозную слишком рано. Если a<b<c и a+b+c == 1000, наименьшее возможное значение с не 500, это 335.

for(int i = 997; i>335; i--){ 

С этой новой нижней границы, b иногда будет больше, чем c, которые преждевременно вызвать некоторые из ваших условными. Однако вы можете удалить их и получить правильный ответ.

for(int i = 997; i>335; i--){ 
     c = i; 
     b = 999-i; 
     a = 1; 

     while(b>(a+2)){ 
      b--; 
      a++; 
      if (isTriplet(a,b,c)){ 
       product=a*b*c; 
       break outerloop; 
      } 
     } 
    } 
+0

Это сделало это, спасибо за ответ! – Stabbz

Смежные вопросы