【问题标题】:Java: Finding the largest chain in a Collatz sequenceJava:在 Collat​​z 序列中找到最大的链
【发布时间】:2012-12-26 01:54:18
【问题描述】:

我找不到 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);        
}

【问题讨论】:

  • 仅供参考,您不需要BigIntegers,long 就足够了。

标签: java collatz


【解决方案1】:

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

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

到这里:

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

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

【讨论】:

    【解决方案2】:

    除了@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。 (并且由于n 在while 循环之后将always(?)equal one,因此您可以完全摆脱第一个条件。)

    最后,i.equals(2)

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

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

    【讨论】:

      【解决方案3】:

      正如 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);
      

      【讨论】:

        猜你喜欢
        • 2022-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多