2012-09-11 72 views
1

我试图找到一个给定的一组数字的公式计算X立方+ Y立方= Z立方+ 1

x^3 + y^3 = z^3 +1 

其中

x < y < z 

下面的代码是什么我已经开始工作。我目前遇到的问题是我生成的随机数只在第一次运行时生成,我无法弄清楚为什么任何帮助或线索如何提高我的代码将不胜感激。第一个答案后

import java.util.Random; 

public class etude14 { 

static int x = 1; 
static int y = 2; 
static int z = 3; 
static int matchCount = 0; 

public static void main(String[] args) { 
    while(matchCount < 23){ 
    equatition(x, y, z); 
    } 
} 

public static void equatition(int x, int y, int z) { 

    double leftResult = Math.pow(x, 3) + Math.pow(y, 3); 
    double rightResult = Math.pow(z, 3) + 1; 

    if (leftResult == rightResult) { 
     System.out.println("Match " + x + " " + y + " " + z); 
     matchCount++; 
     changeX(); 
    } else { 
     System.out.println("No Match " + x + " " + y + " " + z); 
     changeX(); 
    } 
} 

private static void changeX() { 

    Random generator = new Random(); 
    int x2 = generator.nextInt(10000) + 1; 
    int y2 = generator.nextInt(10000) + 1; 
    int z2 = generator.nextInt(10000) + 1; 

    if(x < y && y < z){ 
     System.out.println("WE HAVE NEW X,Y,Z"); 
     x = x2; 
     y = y2; 
     z = z2; 
     return; 
    } 
    System.out.println("CHANGING X"); 
} 
} 

代码

import java.util.Random; 

公共类etude14 {

static int x = 1; 
static int y = 2; 
static int z = 3; 
static int matchCount = 0; 

public static void main(String[] args) { 
    while (matchCount < 23) { 
     equatition(x, y, z); 
    } 
} 

public static void equatition(int x, int y, int z) { 

    double leftResult = Math.pow(x, 3) + Math.pow(y, 3); 
    double rightResult = Math.pow(z, 3) + 1; 

    if (leftResult == rightResult) { 
     System.out.println("Match " + x + " " + y + " " + z); 
     matchCount++; 
     changeX(); 
    } else { 
     System.out.println("No Match " + x + " " + y + " " + z); 
     changeX(); 
    } 
} 

private static void changeX() { 

    Random generator = new Random(); 

    int x2 = 1; 
    int y2 = 1; 
    int z2 = 1; 

    if (x < y && y < z) { 
     System.out.println("WE HAVE NEW X,Y,Z"); 
     x = x2; 
     y = y2; 
     z = z2; 
     return; 
    } else { 
     x2 = generator.nextInt(10000) + 1; 
     y2 = generator.nextInt(10000) + 1; 
     z2 = generator.nextInt(10000) + 1; 
     System.out.println("CHANGING X"); 

    } 

} 

}

输出

No Match 1 2 3 

我们有新的X,Y,Z 匹配1 1 1 改变x 匹配1 1 1 改变x 匹配1 1 1 改变x 匹配1 1 1 改变x 匹配1 1 1 改变x 匹配1 1 1 改变x 匹配1 1 1 改变x 匹配1 1 1 改变x 匹配1 1 1 改变x 匹配1 1 1 改变x 匹配1 1 1 改变x 匹配1个1 1 改变x 匹配1 1 1 改变x 匹配1 1 1 改变x 匹配1个1 1 改变x 匹配1 1 1 改变x 匹配1 1 1 CHANGING X 匹配1 1 1 改变x 匹配1 1 1 改变x 匹配1个1 1 改变x 匹配1 1 1 改变x 匹配1 1 1 改变x 匹配1 1 1 改变x

+0

你可能想使用类似[牛顿法(http://en.wikipedia.org/wiki/Newton %27s_method)或其后继者之一。 –

+1

当你不知道什么是错的时候,我们并不善于提供帮助,你可能想在来这里之前先弄清楚什么是错误的。要尝试的技巧包括使用调试器或将调试语句添加到代码中。 –

回答

1

你随机genetator“停止”当z成为少数生成。

在这种情况下,条件if(x2 < y2 && y2 < z2)很少会进行验证,以便你的号码不会改变。

你需要像

private static void changeX() { 

    Random generator = new Random(); 
    int x2 = generator.nextInt(10000) + 1; 
    int y2 = generator.nextInt(10000) + 1; 
    int z2 = generator.nextInt(10000) + 1; 

    x = Math.min(Math.min(x2, y2), z2); // The Max of the 3 numbers 

    z = Math.max(Math.max(x2, y2), z2); // The Min of the 3 numbers 

    if (x != x2 && z != x2) { // The remaining middle number 
     y = x2; 
    } else if (x != y2 && z != y2) { 
     y = y2; 
    } else { 
     y = z2; 
    } 

} 

也许

private static void changeX() { 

    Random generator = new Random(); 

    List<Integer> listInt = new ArrayList<Integer>(); 

    int x2 = generator.nextInt(10000) + 1; 
    listInt.add(x2); 
    int y2 = generator.nextInt(10000) + 1; 
    listInt.add(y2); 
    int z2 = generator.nextInt(10000) + 1; 
    listInt.add(z2); 

    Collections.sort(listInt); 

    x = listInt.get(0); 
    y = listInt.get(1); 
    z = listInt.get(2); 

} 
+0

谢谢你的回应非常有帮助:) –

1
if(x < y && y < z){ 
    System.out.println("WE HAVE NEW X,Y,Z"); 
    x = x2; 
    y = y2; 
    z = z2; 
    return; 
} 

那么试试这个:

if(x2 < y2 && y2 < z2){ 
    System.out.println("WE HAVE NEW X,Y,Z"); 
    x = x2; 
    y = y2; 
    z = z2; 
    return; 
} 
else{ 
    //repeat the procedure for generating random numbers. 
    // You have one-sixth possibility but that is not quite much. 
} 
+0

谢谢你的回复。我尝试了你的建议,现在它只会运行一小段时间,然后它会停止。 –

+0

对于现代处理器来说,做23次这样的事情并没有太多的工作。 – mehmetminanc

+0

如果您在执行else部分时遇到问题,请查看Stephen Skeleton的答案。 – mehmetminanc

1

的一个问题是在这里

if(x < y && y < z){ 
    x = x2; 
    y = y2; 
    z = z2; 
    return; 
} 

你初始化你的静态整数X,Y和Z 1,2和3,因此您的x < y的测试结果为true,并且y < z为真,因此您执行将x2指定给x等的块。

但是不能保证x2 < y2和y2 < z2适合您随机选择的数字。新值是在您首次点击if语句时设置的,但不可能在此后随时设置,除非您的随机x2,y2和z2碰巧按升序排列。

你需要的是在changeX()循环继续产生随机数,直到x2 < y2 && y2 < z2然后分配新的x,y和z值。但是像

do { 
    ... // set new random values for x2, y2, and z2 
} while (! (x2 < y2 && y2 < z2)); 

东西被警告说,这个循环可以运行可能为很长一段时间,直到你碰巧得到按升序排列3项的值。

随机值不一般以寻求解决公式的好方法 - 你可以反复尝试相同的3个值。

鉴于x2和y2,使得X2 < Y2上有Z2的值,该值可能可能求解方程的下限。一种方法可能是

x2 = random number from 1 to 10,000 
y2 = random number from x2+1 to 10,000 
z2 = method_to_guess_a_lower_limit_for_z2(x2, y2); 

即使这种做法是巨大的天真 - 作为@HotLicks在评论中提到,在近似的牛顿法的一些变化是一个更好的地方开始。

+0

酷感谢回复迄今从每个人都非常有帮助:) –