2012-09-11 70 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

酷感謝回覆迄今從每個人都非常有幫助:) –