2011-10-09 38 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; 
    } 
    } 
}