5

数値の小数展開を計算するプログラムを作成して103993/33102います。ユーザーが入力した数値に応じて、末尾の小数をすべて出力したいと考えています。までのすべての数値に対して高速に実行され10^5ますが、プログラムへの入力10^6が回答を出力するのに約 5 分かかる場合。どうすればスピードアップできますか?文字列を使用する方法と文字列を使用する方法の 2 つの異なるアプローチを試しBigDecimalましたが、どちらも効率的に機能していません。

public static void main(String[] args) throws NumberFormatException,
        IOException {
    // BigDecimal num1 = new BigDecimal(103993);
    // BigDecimal num2 = new BigDecimal(33102);
    String repNum = "415926530119026040722614947737296840070086399613316";
    // pw.println(num.toString());
    String sNum = "3.1";
    // pw.println(repNum.length());
    int cases = Integer.parseInt(br.readLine());
    int dec;
    for (int i = 0; i < cases; i++) {
        sNum = "3.1";
        dec = Integer.parseInt(br.readLine());

        if (dec == 0)
            pw.println("3");
        else if (dec <= 52) {
            sNum += repNum.substring(0, dec - 1);
            pw.println(sNum);
        } else {
            while (dec > 52) {
                sNum += repNum;
                dec -= 51;
            }
            sNum += repNum.substring(0, dec - 1);
            pw.println(sNum);

        }

        // pw.println(num1.divide(num2, dec,
        // RoundingMode.FLOOR).toString());
    }
}
4

1 に答える 1

2

数字の長い文字列を作成する代わりに、数字を出力するだけです。例えば:

        while (dec > 52) {
            System.out.print(repNum);
            dec -= 51;
        }
        pw.println(repNum.substring(0, dec - 1));

文字列は不変であるため、連結によってループ内に長い文字列を作成すると、パフォーマンスが大幅に低下します。プログラムは、一方が他方よりも長い新しい文字列を作成し、古い文字列から新しい文字列に文字をコピーすることにすべての時間を費やし、基本的にシュレミエルの画家のアルゴリズムを実装します。

于 2013-03-02T17:30:51.200 に答える