2012-08-17 125 views
3

對於以下代碼,當「n」大約100,000時停止運行。我需要它運行到100萬。我不知道它出錯的地方,我仍然在學習Java,所以在代碼中也可能存在一些簡單的錯誤。循環停止運行java

public class Problem14{ 
public static void main(String[] args) { 
    int chainLength; 
    int longestChain = 0; 
    int startingNumber = 0; 
    for(int n =2; n<=1000000; n++) 
    { 
     chainLength = getChain(n); 
     if(chainLength > longestChain) 
     { 
      System.out.println("chainLength: "+chainLength+" start: "+n); 
      longestChain = chainLength; 
      startingNumber = n; 
     } 
    } 

    System.out.println("longest:"+longestChain +" "+"start:"+startingNumber); 
} 
public static int getChain(int y) 
{ 
    int count = 0; 
    while(y != 1) 
    { 
     if((y%2) == 0) 
     { 
      y = y/2; 
     } 
     else{ 
      y = (3*y) + 1; 
     } 
     count = count + 1; 
    } 

    return count; 
} 
} 
+0

我只是好奇 - 一般來說代碼的目的是什麼? – Coffee 2012-08-17 15:39:04

+1

您是否嘗試捕獲異常以查看是否拋出了未處理的異常?也許堆棧溢出? – 2012-08-17 15:40:11

+1

我在做Euler項目,它是一個網站,你必須解決數學問題。 繼承人我在做的問題:http://projecteuler.net/problem=14 – stackErr 2012-08-17 15:41:41

回答

6

請使用long作爲data type,而不是int

我想這是進入光,該號碼不甩到高於 1000000所以可變y需求long拿着它。

+1

100萬完全在32位整數內 - 仍然試圖弄清楚什麼是錯的! – Dan 2012-08-17 15:42:16

+1

對於'n'?在int類型的範圍內,1,000,000可以正常工作。 – 2012-08-17 15:42:17

+0

也許我在這裏很密集,但「1000000」幾乎不需要2個字節。爲什麼需要「長」? – 2012-08-17 15:42:52

5

這是的數據類型。它應該是。否則,它會回到-2億美元。

我以爲我認識到這一點 - 這是歐拉問題14.我自己做了這個。

+1

是的,謝謝,庫馬爾通過:)擊敗了你,所以我會標記他的答案是正確的。 – stackErr 2012-08-17 15:48:33

+0

你不需要這個功能 - 只需要把它放在for中即可。在做鏈之前將n複製到一個長變量中。你可以清理的其他東西是使用y/= 2而不是y = y/2等運算符,並且用count ++而不是count = count + 1等等。 – Dan 2012-08-17 15:49:15

+0

感謝提示! – stackErr 2012-08-17 16:09:06

1

getChain()方法導致問題,它得到否定的,然後它永遠掛在循環中。