2011-10-09 60 views
7

actualmente estoy tratando esta cuestión:Código para la búsqueda de tripletes pitagóricos

Un triplete de Pitágoras es un conjunto de tres números naturales, a, b, c, para lo cual un + b = c .

Por ejemplo, 3 + 4 = 9 + 16 = 25 = 5 .

Existe exactamente un triplete pitagórico para el cual a + b + c = 1000. Encuentra el producto abc.

Mi código es el siguiente, creo que debería ser correcto, pero el sitio me dice que mi respuesta es incorrecta. ¿Alguien puede ayudarme a ver los defectos en mi lógica, por favor?

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

¿Qué respuesta estás recibiendo? – Jeffrey

+1

¿Quizás agregar referencia para projecteuler? –

+0

@Simon Kiely +1 por tratar de resolver el proyecto euler. Pero debería darle un poco más de prueba :) – FailedDev

Respuesta

7

creo que se está perdiendo un conjunto de aparatos de ortodoncia. La sangría me lleva a creer que las dos declaraciones más internas van juntas, pero necesitas llaves para que eso sea correcto.

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

Sin los apoyos product siempre contendrá el producto de los últimos valores de a, b, y c. (333 * 500 * 167 == 27805500).

+0

+1 Este es el problema para la solución OPs. – FailedDev

+0

+1. Las llaves faltaban y los últimos valores siempre se muestran, como dijo Blastfurnace. También siempre me gusta tener frenos incluso con forros uno. Pero esa es la preferencia de la persona. –

2

Usted puede tratar de esta manera,

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

Esto implementa la fórmula de Euclides para generar triplete de Pitágoras como se explica here

Tenga en cuenta que en este método hacemos sólo trillizos se reducen las repeticiones, por lo tanto no deseados.

y la salida es a: 375 b: 200 c: 425 Product es 31875000

2

Aunque otros ya han dado los arreglos específicos para que el código, aquí va una pista más general que será útil en otros problemas también. Pruebe su código en una versión más simple del problema.

Por ejemplo, vea si su programa puede encontrar 6,8,10 como triplete con una suma de 24. Con una prueba más pequeña, puede recorrer el código para ver dónde está yendo mal.

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

Er ... Creo que el OP quiere encontrar las trillizas programáticamente, no calcula el hipotenuso para los valores ingresados ​​manualmente. –

10

Éstos son 5 soluciones (de lenta a rápida):

1) Implementación de Trivial - 732 857 microsegundos (0.7 segundos)

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) limitar el límite inferior para B & c (establecer la relación de orden) - 251.091 microsegundos (0,2 segundos)

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) el límite inferior & límites superiores para b & c - 111.220 microsegundos (0,1 segundos)

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) límite inferior & límites superiores para b y fix valor para c - 2625 microsegundos

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) Usar Euclides 's fórmula - 213 microsegundos

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

no hay duda de que el quinto es más rápido, pero para ello tenemos que recordar la fórmula – 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; 
    } 
    } 
} 
Cuestiones relacionadas