2011-11-14 20 views
0

我一直有麻煩試圖找出如何解決一個功能。我已經被分配了一個小程序的開發,該程序告訴一個數字是否是「三角形」(當[1,n]區間內的某些連續數字的相加是n時,數字是三角形)。根據定義,數字10是三角形的,因爲在[1,10]區間中,1 + 2 + 3 + 4 = 10)。混亂的一段時間陳述評估如果一個數字是三角形的

到目前爲止,我這個編碼:

class TriangularNumber{ 

    boolean numTriangular(int n) { 
    boolean triangular = false; 
    int i = n; 
    while(n>=0 && triangular){ 
    //UE06 is a class which contains the function "f0", which makes the addition of all the numbers in a determined interval 
    UE06 p = new UE06(); 
     if ((p.f0(1, i))==n) 
     triangular = true; 
     else 
     i=i-1; 
    } 
    return triangular; 
    } 

boolean testTriangular = numTriangular(10) == true && 
    numTriangular(7) == false && 
    numTriangular(6) == true; 

    public static void main(String[] args){ 

    TriangularNumber p = new TriangularNumber(); 
    System.out.println("testTriangular = " + p.testTriangular); 
    } 
} 

根據我做這些布爾測試,該功能是錯誤的。正如我看到的功能,它是這樣的:

  1. 我指出,在初始狀態下的輸入數量不是三角形 (三角=假)和i = N(確定區間[1,I]其中 功能將被評估
  2. 當n爲大於或等於0,號碼是不是三角形,將 循環開始
  3. 循環是這樣的:如果除所有號碼在 [1,i]區間爲n,數字爲三角形,導致循環結束,如果該語句爲假,我從i到(i-1),sta再次以該特定間隔循環 ,依此類推,直到 增加爲n。

我不能在我的「算法」中發現錯誤,有什麼建議嗎?

謝謝!

+0

如果這是一個家庭作業,請相應地標記它。另外,你的問題是什麼? – Tudor

+0

我添加了作業標籤,很抱歉! – jjcastil

回答

0

在你的循環中的條件應改爲:

while(i>=0 && !triangular) 
+0

給出的解釋,在我的代碼中更改這段代碼解決了錯誤。但我似乎無法理解爲什麼我不能把n和只是「三角形」,不是說while語句裏面的「初始狀態」是什麼?非常感謝! – jjcastil

+0

@Darkkurama你在while語句中的含義是你所描述的:當i大於或等於0(i> = 0)且數字不是三角形(!三角形)時。您需要使用i而不是n,因爲對於每個迭代,您的子集由[1; i]定義,並且在每次迭代後(i = i-1)減少子集。否則,你會陷入一個無限循環試圖解決:sum(1,n)= n – laguille

+0

好了,現在我明白了! – jjcastil

4

while(n>=0 && triangular){triangular = false所以,你永遠不會執行該功能。

另一個問題是,如果你在你的循環中,並且數字不是三角形的,你永遠不會和它,因爲你測試n,但減少我。

再試一次嗎? ;)(這看起來像功課,所以,我不爲你寫的功能,只是幫助你,並指出在你的代碼中的一些問題)

+0

謝謝!這有助於理解while語句和@laguille – jjcastil

1

我會使用數學來避免需要循環。第n的總和爲n* (n + 1)/2這樣你就可以估算一下nsqrt(n * 2)

public static void main(String... args) { 
    for(int i=1;i<=1000;i++) 
     if (isTriangular(i)) 
      System.out.print(i + " "); 
    System.out.println(); 
} 

public static boolean isTriangular(int num) { 
    // guess the nth for this num. 
    int nth = (int) Math.sqrt(num * 2); 
    return sumToN(nth) == num; 
} 

public static int sumToN(int nth) { 
    return nth * (nth + 1)/2; 
} 

打印

1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 210 231 253 276 300 325 351 378 406 435 465 496 528 561 595 630 666 703 741 780 820 861 903 946 990