计算Pi Java程序

时间:2014-02-10 19:22:01

标签: java oop

我正在学习我的第一个Java编程课程,这是我的第一个课程。我对如何处理它感到很困惑。任何帮助或更正将不胜感激。

您可以使用以下系列来估算常量PI的值:

PI = 4 ( 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ... + ( (-1)^(i+1) )/ (2i - 1) )

提示用户输入i的值(换句话说,使用此系列中的术语数) 计算PI。例如,如果用户输入10000,则对该系列的前10,000个元素求和,然后显示结果。

除了显示最终结果(PI的最终近似值)之外,我希望您显示中间数在每次幂10时的计算方式。所以10,100,1000,10000等等,显示给在该数量的求和元素上筛选PI的近似值。

这就是我到目前为止所做的..

import java.util.Scanner;
        public class CalculatePI {

            public static void main(String[] args) {
                // Create a Scanner object
                Scanner input = new Scanner (System.in);

                // Prompt the user to enter input
                System.out.println("Enter number of terms");
                double i = input.nextDouble(); // value of i user entered
                    double sum = 0;
                for(i=0; i<10000; i++){
                           if(i%2 == 0) // if the remainder of `i/2` is 0
                           sum += -1 / ( 2 * i - 1);
                        else
                           sum += 1 / (2 * i - 1);
    }

                        System.out.println(sum);


    }
}

5 个答案:

答案 0 :(得分:8)

我看到的第一件事是您尝试从void main方法返回一个值。

请勿使用主要方法return pi;。打印出来。

System.out.println(pi);

其次,当人们编写for循环时,他们通常会迭代i,这可能与您的教授在公式中提到的i相同

for(double i=0; i<SomeNumber; i++)
{
    sum += ((-1)^(i+1)) / (2 * i - 1) );
}

现在,这将无法正常工作,您仍然必须处理^,java本身不使用。幸运的是,-1^(i+1)是一个交替的数字,所以你可以使用if语句

for(double i=0; i<SomeNumber; i++)
{
    if(i%2 == 0) // if the remainder of `i/2` is 0
        sum += -1 / ( 2 * i - 1);
    else
        sum += 1 / (2 * i - 1);
}

答案 1 :(得分:2)

有时答案是一行简单的代码。此外,您将i重新分配给0,因此我假设您以错误的方式使用用户输入。

for(int counter=1;counter<input;counter++){
    sum += Math.pow(-1,counter + 1)/((2*counter) - 1);
}
输入的

应该是任何变量,硬编码或由用户输入设置(例如1000,10000,100000)。这应该工作

答案 2 :(得分:2)

理解公式:在尝试通过代码解决之前,请考虑公式的性质。我这样说是因为如果你这样做,你就不会尝试用以下代码在正面和负面之间交替:

if(i%2 == 0)
    sum += -1 / ( 2 * i - 1); 
else
    sum += 1 / (2 * i - 1);

由于分子,

系列在正数和负数之间交替显示

-1 ^ (i + 1)

当指数为偶数时,分子为正。当指数为奇数时,分子为负数。这意味着您的代码中不需要在正数和负数之间交替,因为公式本身就是这样。此外,必须在括号1st中计算求和,然后在末尾乘以4。

代码中的公式:要在代码中编写公式,您应该知道您需要Math.pow(base,exponent)方法来获取幂。例如,2 ^ 3是Math.pow(2,3)。考虑到这种方法,公式会这样:

PI = 4 * (1 - 1/3 + 1/5 + ... + Math.pow(-1, i + 1) / (2 * i - 1));

计算PI:您可以使用for循环通过使用for循环来计算PI,如下所示:

for (int i = 10000; i > 0; i--) {
      PI += Math.pow(-1, i + 1) / (2 * i - 1); // Calculate series in parenthesis
      if (i == 1) { // When at last number in series, multiply by 4
        PI *= 4;    
        System.out.println(PI); // Print result
      }  
}

我选择让我的for循环从10000开始并在i = 1时结束。基本原因是在Java中,由于浮点数的舍入,如果添加较小的数字,您将获得更准确的结果1,并努力工作到更大的数字。所以,我是从右到左而不是从左到右计算系列。然后我允许程序计算括号中的值,只有系列中的最后一个数字才会乘以4并打印结果。

注意你可以用这样的用户输入替换10000:

java.util.Scanner input = new java.util.Scanner(System.in); //You can import instead
System.out.println("Enter number of loops: ");
int loops = input.nextInt();

for (int i = loops; i > 0; i--) {
...

答案 3 :(得分:0)

//这是使用巴比伦方法进行PI近似的公式。

int count = 10;
int m = 1;
int n = 0;
double pi = 0.0;
final double SQRT_12 = Math.sqrt(12);
while (count > n)
{
    pi += SQRT_12 * (Math.pow(-1, n)/(m * Math.pow(3, n)));
    System.out.println(pi);
    m += 2;
    n++;
}

答案 4 :(得分:0)

    double Pi = 0.0;
    long start = System.currentTimeMillis();
    for (double i = 1; i < 100000000; i++) {
        Pi += (i % 2 == 0) ? -1 / (2 * i - 1) : 1 / (2 * i - 1);
    }
    long stop = System.currentTimeMillis();
    System.out.println(Pi * 4);
    System.out.println(Math.PI);
    System.out.println(stop-start);
    // output:
    // 3.141592663589326
    // 3.141592653589793
    // 2426