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

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();
}

nループ内では決して等しくならないため、while ループの外で使用されoneます。(そして、nwill always(?)は while ループの後で等しい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 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 に答える