3

我找不到 Project Euler 问题 #14 的问题所在。我的第一步是找到算法,该算法一直有效,直到数字达到 120000 左右。代码中断并意识到我需要使用 BigIntegers。我转换了我的算法以适应这种变化,但现在它不起作用。

我添加了 System.out.print(chain_length) 来帮助我解决我的代码可能会中断的地方。

public static void main(String[] args) {
    BigInteger target = new BigInteger("1000000");
    BigInteger n = new BigInteger("0");

    final BigInteger zero = new BigInteger("0");
    final BigInteger one = new BigInteger("1");
    final BigInteger two = new BigInteger("2");
    final BigInteger three = new BigInteger("3");
    final BigInteger ten = new BigInteger("10");

    int greatest_index = 0;
    int greatest_length = 0;
    int chain_length = 0;

    BigInteger i = new BigInteger("2");
    for(i.equals(2) ; i.compareTo(target) == -1 ; i = i.add(one)) {
        n = i;
        chain_length = 1;
        while(n.compareTo(one) == -1) {
            chain_length++;
            if(n.mod(ten).equals(zero) == true){//even
                n = n.divide(two);
            }else{//odd
                n = n.multiply(three);
                n = n.add(one);
            }
            if(n.equals(one) == true && chain_length > greatest_length){
                greatest_length = chain_length;
                greatest_index = i.intValue();
            }
        }
        System.out.println(chain_length);
    }
    System.out.println(greatest_index);        
}
4

3 回答 3

7

要测试一个数字是否为偶数,请使用模 2,而不是 10。更改此行:

if(n.mod(ten).equals(zero) == true){//even

对此:

if(n.mod(two).equals(zero)) { //even

我还删除了不必要的== true.

于 2012-12-26T01:59:04.403 回答
3

除了@MarkByers 的回答,

while(n.compareTo(one) == -1)

应该

while(n.compareTo(one) > 0)

或者,在伪代码中,while n > 1.

你也应该采取

if(n.equals(one) == true && chain_length > greatest_length){
    greatest_length = chain_length;
    greatest_index = i.intValue();
}

在while循环之外,因为在循环内n永远不会相等one。(并且由于在 while 循环之后n始终(?)相等one,您可以完全摆脱第一个条件。)

最后,i.equals(2)

for(i.equals(2) ; i.compareTo(target) == -1 ; i = i.add(one))

没有做任何有用的事情 - 它只是为大多数值返回 false。

于 2012-12-26T05:48:39.087 回答
0

正如 Daniel Fischer 所指出的,您应该使用 long。小心不要做类似的事情
long a = 987654321
正确的版本(如果你想要长)long a = 987654321L:。
简单版:

int maxChain = 0;
    int answer = 0;
    for (int i = 1_000_000; i > 0; i--) {
        int chain = 0;
        long n = i;
        while (n != 1) {
            if ((n & 1) != 1) { //Is even
                n = n / 2;
                chain++;
            } else { //Is odd
                n = 3 * n + 1;
                chain++;
            }
        }
        if (chain > maxChain) {
            maxChain = chain;
            answer = i;
        }
    }
    System.out.println(answer);
    System.out.println(maxChain);
于 2015-02-14T20:52:10.690 回答