2012-08-17 130 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()方法导致问题,它得到否定的,然后它永远挂在循环中。