1

私はこのアルゴリズムの実装に取り​​組んでいます:

アルゴリズム

Piを返す必要があります。(3.14159265358997...)

ただし、3465 が返されます。08380616409399027053866316721684448367402010300966908309332973882999599659411211360242758373861308317643879780635184630098290272242883357405022286118769447139626740529154581760953310875095436535421219560594138762255908511917640030648067526109299744243940829460378910596439045439520465157646027690925590763148740548652082423588324877104387482766153998770169941684101802144682649967882757012123536830687257625430659822900932688971775399671873439271861807516504946648728835994224480190316893471461417030967875760350601186694437246158814749867709842784785131871243300974810329494822914089815426723108584630705497725315669913077299913418398857508437241498586991317385422304195098176197989649564351502676047855067112916239074816487154114049778906276077976862652238724331693187819339345278554873704778412189443547257967444970511424806150609434006569113662932077764862975010524542830427816636583274986465383665844386822482378789858671283376729834456505152396380274210110769559485082136039898561801

これが私のコードです:

package picalculator;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;


/**
 *
 * @author ThomasSatterthwaite
 */

public class PiCalculator {

static int odd=1;

public static void main(String[] args) {
    System.out.println("Please wait while I calculate pi...");
    calculatePi();
    System.out.println("I have successfully calculated pi.");
}
public static void calculatePi() {
    BigInteger firstFactorial;
    BigInteger secondFactorial;
    BigInteger firstMultiplication;
    BigInteger firstExponent;
    BigInteger secondExponent;
    int firstNumber = 1103;
    BigInteger firstAddition;
    BigDecimal currentPi = BigDecimal.ONE;
    BigDecimal pi = BigDecimal.ONE;
    BigDecimal one = BigDecimal.ONE;
    int secondNumber = 2;
    double thirdNumber = Math.sqrt(2.0);
    int fourthNumber = 9801;
    BigDecimal prefix = BigDecimal.ONE;
    DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");

    for(int i=1;i<1000;i++){
        firstFactorial = factorial(4*i);
        secondFactorial = factorial(i);
        firstMultiplication = BigInteger.valueOf(26390*i);
        firstExponent = exponent(secondFactorial, 4);
        secondExponent = exponent(BigInteger.valueOf(396),4*i);
        firstAddition = BigInteger.valueOf(firstNumber).add(firstMultiplication);
        currentPi = currentPi.add(new BigDecimal(firstFactorial.multiply(firstAddition)).divide(new BigDecimal(firstExponent.multiply(secondExponent)), new MathContext(10000)));
        Date date=new Date();
        System.out.println("Interation: " + i + " at " + dateFormat.format(date));
    }

    prefix =new BigDecimal(secondNumber*thirdNumber);
    prefix = prefix.divide(new BigDecimal(fourthNumber), new MathContext(1000));

    currentPi = currentPi.multiply(prefix, new MathContext(1000));

    pi = one.divide(currentPi, new MathContext(1000));

    System.out.println("Pi is: " + pi);

    return;
}
public static BigInteger factorial(int a) {

    BigInteger result=new BigInteger("1");
    BigInteger smallResult = new BigInteger("1");
    long x=a;
    if (x==1) return smallResult;
    while(x>1)
    {
        result= result.multiply(BigInteger.valueOf(x));

       x--;
    }
    return result;
}
public static BigInteger exponent(BigInteger a, int b) {
    BigInteger answer=new BigInteger("1");

    for(int i=0;i<b;i++) {
        answer = answer.multiply(a);
    }

    return answer;
}

}

私がしていることに問題を見つけることができる人はいますか? よろしくお願いします!

4

2 に答える 2

4

最初の部分合計を正しく処理していません。と で開始する必要がある場合i=1、最初の部分合計でループを開始します。currentPi=1i=0currentPi=0

(これは、最初の部分和 ( の場合k=0) が 1 に等しい場合に機能しますが、実際には 1103 に等しくなります。)

于 2012-03-20T19:03:54.537 に答える
2

i = 0. および currentPi = 0 でループを開始する必要があります。

// ...
BigDecimal currentPi = BigDecimal.ZERO;
// ...
for(int i = 0; i < 1000; i++) {
    // ...
}
// ...

これは与える:

3.1415926535897930237...

于 2012-03-20T19:04:43.397 に答える