2011-10-09 71 views
7

我目前正在嘗試這樣一個問題:代碼發現勾股數

一個勾股數是一組三個自然數a,b和c,對於這 一個 + B = c 。

例如,3 + 4 = 9 + 16 = 25 = 5 2

只存在一個畢達哥拉斯三元組,其中a + b + c = 1000. 查找產品abc。

我的代碼如下,我認爲它應該是正確的,但該網站告訴我我的答案是錯誤的?有人能幫我看看我的邏輯中的缺陷嗎?

public class Pythagoras { 
    public static void main(String[] args) { 
      int sum = 1000; 
      int a; 
      int product=0; 
      for (a = 1; a <= sum/3; a++) 
      { 
       int b; 
       for (b = a + 1; b <= sum/2; b++) 
       { 
        int c = sum - a - b; 
        if (c > 0 && (a*a + b*b == c*c)) 
         System.out.printf("a=%d, b=%d, c=%d\n",a,b,c); 
         product = a * b * c; 
       } 
      } 
      System.out.println(product); 
     } 
    } 
+0

你得到了什麼答案? – Jeffrey

+1

可能會增加投影儀的參考? –

+0

@Simon Kiely +1試圖解決項目歐拉。但是你應該多給一點:) – FailedDev

回答

7

我想你錯過了一套大括號。縮進使我相信兩個最內在的陳述走到一起,但你需要花括號來證明這是正確的。

if (c > 0 && (a*a + b*b == c*c)) 
{ 
    System.out.printf("a=%d, b=%d, c=%d\n",a,b,c); 
    product = a * b * c; 
} 

如果沒有括號product將始終包含的ab,並c最後值的乘積。 (333 * 500 * 167 = 27805500)。

+0

+1這是OP解決方案的問題。 – FailedDev

+0

+1。 Blastfurnace說,大括號缺失,最後的值總是顯示出來。我也總是喜歡即使有一條襯墊也戴上牙套。但那是人的偏好。 –

2

你可以這樣試試吧,

public class Pythagoras { 

    public static void main(String[] args) { 

     int m = 1, n = 0, a = 0, b = 0, c = 0, sum = 0; 
     int product = 0; 

     for (m = 2; m < 100; m++) { 
      for (n = 1; n < 100; n++) { 

       while (m > n) { 

        a = (m * m) - (n * n); 
        b = (2 * m) * n; 
        c = (m * m) + (n * n); 

        sum = a + b + c; 


        if (sum == 1000) { 
         product = a * b * c; 

         System.out.print("a :" + a + "b :" + b + "c : " + c); 
         System.out.println("Product is" + product); 
         break; 
        } 
        break; 
       } 
      } 
     } 
    } 
} 

這實現了歐幾里德的產生勾股數公式解釋here

注意,在這個方法中,我們只作三胞胎,因此不需要重複減少。

,輸出爲a:375 b:200 c:425 Product是31875000

2

雖然其他人已經給出了具體修復您的代碼,這裏是一個更一般的暗示,這將是對其他問題也是有用的。 在簡單版本的問題上測試您的代碼。

例如,看看你的程序是否可以找到6,8,10作爲一個總和爲24的三元組。通過一個較小的測試,你可以實際瀏覽代碼,看看它出錯的地方。

2

//

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
public javax.swingx.event.*; 

public class Triplet extends JApplet implements ActionListener 
{ 
JLabel l1, l2, l3; 
JButton b1; 
JTextFiel t1, t2; 
public void init() 
{ 
    Container c = getContentPane(); 
    c.setLayout(new FlowLayout()); 
    l1=new JLabel("Enter the value of a: "); 
    l2=new JLabel("Enter the value of b: "); 
    t1 = new JTextField(20); 
    t2 = new JTextField(20); 
    b1=new JButton("Ok"); 
    l2=new JLabel("  "); 
    add(l1); 
    add(t1); 
    add(l2); 
    add(t2); 
    add(b1); 
    add(l3); 
    b1.addActionListener(this); 

    public void ActionPerformed(ActionEvent e) 
    { 
     int a = Integer.parseInt(t1.getText()); 
     int b = Integer.parseInt(t2.getText()); 
     long c = Math.sqrt(a*a + b*b); 
     l3.setText(" " +c); 
    } 
    } 
} 
+0

呃...我認爲OP希望以編程的方式找到三元組,而不是計算手動輸入的值。 –

10

這裏有5解決方案(由慢到快):

1)簡單的實現 - 732857微秒(0。7秒)

private static void p1(int sum) { 
    for (int a = 0; a <= sum; a++) { 
     for (int b = 0; b <= sum; b++) { 
      for (int c = 0; c <= sum; c++) { 
       if (a < b && b < c && a + b + c == sum 
         && (c * c == a * a + b * b)) { 
        System.out.print(a * b * c); 
        return; 
       } 
      } 
     } 
    } 
} 

2)限制下界對於b & C(建立的順序關係) - 251091微秒(0.2秒)的

private static void p2(int sum) { 
    for (int a = 0; a <= sum; a++) { 
     for (int b = a + 1; b <= sum; b++) { 
      for (int c = b + 1; c <= sum; c++) { 
       if (a + b + c == sum && (c * c == a * a + b * b)) { 
        System.out.print(a * b * c); 
        return; 
       } 
      } 
     } 
    } 
} 

3)限制在下&上限對於b &ç - 111220微秒(0.1秒),

private static void p3(int sum) { 
    for (int a = 0; a <= sum; a++) { 
     for (int b = a + 1; b <= sum - a; b++) { 
      for (int c = b + 1; c <= sum - a - b; c++) { 
       if (a + b + c == sum && (c * c == a * a + b * b)) { 
        System.out.print(a * b * c); 
        return; 
       } 
      } 
     } 
    } 
} 

4)限制b和固定值的情況下&上限對於C - 2625微秒

private static void p4(int sum) { 
    for (int a = 0; a <= sum; a++) { 
     for (int b = a + 1; b <= sum - a; b++) { 
      int c = sum - a - b; 
      if (c > b && c * c == a * a + b * b) { 
       System.out.print(a * b * c); 
       return; 
      } 
     } 
    } 
} 

5)使用歐幾里得的式 - 213微秒

private static void p5(int sum) { 
    // a = m^2 - n^2 
    // b = 2mn 
    // c = m^2 + n^2 
    int a, b, c; 
    int sqrt = (int)Math.sqrt(sum); 
    for (int n = 1; n <= sqrt; n++) { 
     for (int m = n+1; m <= sqrt; m++) { 
      a = m*m - n*n; 
      b = 2*m*n; 
      c = m*m + n*n; 
      if (a + b + c == 1000) { 
       System.out.print(a * b * c); 
       return; 
      } 
     } 
    } 
} 
+0

毫無疑問,第五個更快,但對此我們必須記住公式 – Aamir

0
public class Pythagorean_Triplets 
{ 
public static void main(long n) 
{ 
long h=1,p=1,b1; 
double b; 
while(h<=n) 
{ 
    while(p<h) 
    { 
    b=Math.sqrt((h*h)-(p*p)); 
    if(b%1==0) 
    { 
    b1=(long)b; 
    System.out.println(b1+","+p+","+h); 
    break; 
    }   
    p++; 
    }  
    h++;   
    p=1; 
    } 
    } 
}