用循环:
int i=1
boolean flag=ture;
double oldpi=0;
double newpi=10;while(Math.abs(newpi-oldpi)>1.0E6){
oldpi=newpi
if(flag){
  newpi+=4*(1/i);
}
else
{
newpi-=4*(1/i);}
i+=2;
flag=!flag;}菜鸟献丑,请多指教

解决方案 »

  1.   

    class PI
    {
    public static void main(String[] args) 
    {
    System.out.println("开始时间:"+(new java.util.Date()));
    long start = System.currentTimeMillis();
    double pi_value = 0;
    boolean flag = true;
    int n = 0;
    for(int i=1; i<300000; i++){
    if(i%2==0){
    continue;
    }
    if(flag){
    pi_value += (1/((double)i))*4;
    flag = false;
    }
    else{
    pi_value += -(1/((double)i))*4;
    flag = true;
    }
    if( (pi_value+"").length() > 6 && ((pi_value+"").substring(0,7)).equals("3.14159") ){
    n = i-2;
    break;
    }
    }
    long end = System.currentTimeMillis();
    System.out.println("结束时间:"+(new java.util.Date()));
    System.out.println("运算时间:"+((double)(end - start)/1000)+" 秒");
    System.out.println("第一次得到符合条件的结果:"+pi_value);
    System.out.println("得到此结果时的N的值:     "+(n+2));
    System.out.println("得到此结果前的N的最大值: "+n);
    }
    }======================  运行结果 ===============开始时间:Tue Jan 18 10:30:32 CST 2005
    结束时间:Tue Jan 18 10:30:34 CST 2005
    运算时间:1.843 秒
    第一次得到符合条件的结果:3.141599999994786
    得到此结果时的N的值:     272241
    得到此结果前的N的最大值: 272239
      

  2.   

    1.
    public class Pi
    {
      public static void main(String[] args)
      {
        double oldPI=4, newPI=4.0-4.0/3.0, term=0;
        int i = 5;
        double sign = 1.0;
        while (Math.abs(newPI-oldPI) > 0.00001)
        {
          oldPI = newPI;
          term = sign*4/i;
          newPI = newPI+term;
          i = i+2;
          sign = -sign;
        }
        System.out.println("The PI is " + newPI);
        System.out.println("The number of terms needed is " + i/2);
      }
    }
      

  3.   

    根据经验得出N值,再根据N值对程序优化,可以减少很多判断。。class PI
    {
    public static void main(String[] args) 
    {
    System.out.println("开始时间:"+(new java.util.Date()));
    long start = System.currentTimeMillis();
    double pi_value = 0;
    boolean flag = true;
    int n = 0;
    for(int i=1; i<272250; i++){
    if(i%2==0){
    continue;
    }
    if(flag){
    pi_value += (1/((double)i))*4;
    flag = false;
    }
    else{
    pi_value += -(1/((double)i))*4;
    flag = true;
    }
    if( i>272230 && ((pi_value+"").substring(0,7)).equals("3.14159") ){
    n = i-2;
    break;
    }
    }
    long end = System.currentTimeMillis();
    System.out.println("结束时间:"+(new java.util.Date()));
    System.out.println("运算时间:"+((double)(end - start)/1000)+" 秒");
    System.out.println("第一次得到符合条件的结果:"+pi_value);
    System.out.println("得到此结果时的N的值:     "+(n+2));
    System.out.println("得到此结果前的N的最大值: "+n);
    }
    }=============== 修改后运行时间 =============开始时间:Tue Jan 18 10:36:54 CST 2005
    结束时间:Tue Jan 18 10:36:55 CST 2005
    运算时间:0.015 秒
    第一次得到符合条件的结果:3.141599999994786
    得到此结果时的N的值:     272241
    得到此结果前的N的最大值: 272239
      

  4.   

    呵呵,既然大家这么热情,我也说出我的想法吧:
    class PI{
    public static void main(String args[]){
    double PI=3.14159;
    double PII;
    PII=4-PI;
    int N=2;
    boolean flag = true;
    while(flag){
           PII=PII-(double)1/(2*N+1);    
           N++;
        if (PII <= 0) break;    
    }
    System.out.println(N-2);
      }
    }
    这个效率应该不是很高,但算法也是不错的吧!望路人继续指点。24:00前结帐!
      

  5.   

    Pilot006(Kevin)和jackyzgm(昵称) 的效率还可以
      

  6.   

    jackyzgm(昵称)的if( i>272230 && ((pi_value+"").substring(0,7)).equals("3.14159") )
    这个判断:i>272230 是耍赖,怎么能知道这个i从272230开始,不能算好的结果来作为起始点,还不如直接设2772240呢。
    这个判断:((pi_value+"").substring(0,7)).equals("3.14159") 效率太低。应该直接比较大小,这样效率会提高两个数量级。pi_value > 3.14159 && pi_value < 3.1416
      

  7.   

    结帐之前,我说出我的原来的算法,这样才算公平,以免有人说我乱要程序的。
    1、
    class Me{
    public static void main(String args[]){
    int i=3;
    double oldPI=4.0-4.0/3.0;
    double PI=0;
    do{
    if((i%2)==0){
    PI=(float)1/(2*i-1);
    }
    else{
    PI=(float)-1/(2*i-1);
    }
    oldPI=oldPI+PI;
    i++;

    }while(oldPI<3.14159);
    System.out.println(i);
    }
    }