3

私はプロジェクトオイラーの問題20を解決しようとしてきました:

n!n(n 1)... 3 * 2 * 1を意味します。たとえば、10!= 10 * 9 ... 3 * 2 * 1 = 3628800、および数字の10の桁の合計!は3+6 + 2 + 8 + 8 + 0 + 0 = 27です。数字の100の桁の合計を見つけてください!

これは私がこれまでに思いついたものです。このコードですでに正解(648)を取得しましたが、コードが無限ループであるため、少しOCを取得しました。結果がwhileループ内で0になった後、それは停止しませんでした。誰かが私がこれを修正するのを手伝ってもらえますか?

public static BigInteger problem20(int max){
    BigInteger sum = BigInteger.valueOf(0);
    BigInteger result = BigInteger.valueOf(1);
    BigInteger currentNum = BigInteger.valueOf(0);

    for(long i = 1; i<=max; i++){
        result  = result.multiply(BigInteger.valueOf(i));
        //System.out.println(result);
    }

    while (!result.equals(0)) {
        sum = sum.add(result.mod(BigInteger.valueOf(10)));
        result = result.divide(BigInteger.valueOf(10));
        System.out.println(sum + " "+ result);
    }
    return sum;
}
4

4 に答える 4

5

これが問題です:

while (!result.equals(0))

resultは、であり、これは。BigIntegerと等しくなることはありませんInteger。使ってみてください

while (!result.equals(BigInteger.ZERO))
于 2011-10-14T16:38:34.257 に答える
1

別の可能性はを使用することwhile (fact.compareTo(BigInteger.ZERO) > 0)です。

BigInteger.ZERO可能な場合は、BigInteger.ONEを使用することをお勧めしますBigInteger.TEN

例:

import java.math.BigInteger;

public class P20 {

    public static void main(String[] args) {
        System.out.println(getSum(100));
    }

    private static long getSum(int n) {
        BigInteger fact = BigInteger.ONE;
        for (int i = 2; i <= n; i++) {
            fact = fact.multiply(BigInteger.valueOf(i));
        }
        long sum = 0;
        while (fact.compareTo(BigInteger.ZERO) > 0) {
            sum += fact.mod(BigInteger.TEN).longValue();
            fact = fact.divide(BigInteger.TEN);
        }
        return sum;
    }

}

4ミリ秒かかります。

次の観察結果を使用して改善できます。

  • 合計はゼロの影響を受けません=>10と100を掛ける必要はなく、20、30の代わりに... 2、3、...を使用するだけで十分です。もちろん、次の事実を使用してこのルールを一般化することができます。5*k * 2*jで割り切れる10
于 2014-11-21T23:32:04.810 に答える
0

コードを次のように変更してください:

    while (!result.equals(BigInteger.valueOf(0))) {
        sum = sum.add(result.mod(BigInteger.valueOf(10)));
        result = result.divide(BigInteger.valueOf(10));
        System.out.println(sum + " "+ result);
    }
于 2011-10-14T16:54:10.183 に答える
0

同じことを行う別の方法があります。この場合、合計を計算する複雑さはO(1)です。

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main{
    public static void main(String[] args){
BigInteger b = BigInteger.valueOf(1);
        for(int i=2;i<=5;i++){
            b = b.multiply(BigInteger.valueOf(i));
        }
        //System.out.println(b);

以下の合計を計算する

final BigInteger NINE = BigInteger.valueOf(9);
            if(b == BigInteger.ZERO){
                System.out.println(b);
            }else if(b.mod(NINE) == BigInteger.ZERO){
                System.out.println(NINE);
            }else{
                System.out.println(b.mod(NINE));
            }

        }`
}
于 2017-06-13T09:25:00.160 に答える