CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 扩展类

小菜一碟,来和大家讨论一下最佳算法,来者有分,答者重分,言出必行!2005.1.18日之前结帐~分数不够可再加!

楼主penghaikun(三个代表)2005-01-18 09:07:13 在 Java / J2SE / 扩展类 提问

有两道很菜的题目:如果不讲究效率,我都可以做出来,但要求效率尽量高或算法尽量优。所以请路人和高手指教。  
  1、请利用数列4*(1-1/3+1/5-1/7+1/9-1/11+........)来取得PI的近似值,写一个程序,要算出在  
        得到3.14159之前,这个数列要取到第N项?  
  2、计算圆周率的近似公式为:(π*π)/12=1-1/(2*2)+1/(3*3)-1/(4*4)+……利用以上无穷级数求精确到小数六位的近似值  
   
   
   
  路过有分,回答一般程序送15min.最优者送50min;一天之内结帐,(尽量完整源码,以免理解歧义)  
  分数不够可再加!  
   
  附:愿交对java算法有研讨的同路人。QQ:285686120  
  问题点数:100、回复次数:34Top

1 楼yulchina(为啥我的可用分总是那么少?)回复于 2005-01-18 09:09:43 得分 1

第一顶!然后去研究Top

2 楼iiop18(iiop)回复于 2005-01-18 09:10:40 得分 1

先記下,再研究Top

3 楼IEQQ(从小事做起)回复于 2005-01-18 09:16:47 得分 1

做个记号,回头再看。Top

4 楼JAVA_3(csdn管理员)回复于 2005-01-18 09:23:32 得分 1

这是做数学啊  
  Top

5 楼xitianjile(空想社會主義)回复于 2005-01-18 09:26:56 得分 1

比如要得到这个时候3.14159是4舍5入吗?Top

6 楼hero1981(英雄)回复于 2005-01-18 09:30:26 得分 9

用循环:  
  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;  
   
  }  
   
  菜鸟献丑,请多指教Top

7 楼zyg158((DD)OTP)回复于 2005-01-18 09:32:20 得分 1

^_^Top

8 楼greenmars2004(火球)(业余程序员)(我会的不多,不过都可以告诉你)回复于 2005-01-18 09:33:19 得分 1

upTop

9 楼treeroot(旗鲁特)回复于 2005-01-18 09:45:54 得分 1

upTop

10 楼syilo(龙飞)回复于 2005-01-18 09:51:04 得分 1

先顶一下了Top

11 楼jiangnanyuzi(江南愚子)回复于 2005-01-18 10:21:44 得分 1

顶,then   研究Top

12 楼redex(cc)回复于 2005-01-18 10:28:20 得分 0

看看.Top

13 楼jackyzgm()回复于 2005-01-18 10:31:42 得分 49

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的最大值:   272239Top

14 楼Pilot006(Kevin)回复于 2005-01-18 10:37:28 得分 15

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);  
      }  
  }Top

15 楼jackyzgm()回复于 2005-01-18 10:37:49 得分 1

根据经验得出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的最大值:   272239Top

16 楼drugon(更高,更远,更强)回复于 2005-01-18 10:38:56 得分 1

感觉到好象要用微积分的,特别是第二问,感觉好象是的,不过时间长了,微积分也忘记的差不多了。Top

17 楼jackyzgm()回复于 2005-01-18 10:39:45 得分 1

要说正宗的程序,应该是我写的第一个,但是我的第二个可以作为做第二道题的时候方便。。Top

18 楼jackyzgm()回复于 2005-01-18 10:39:48 得分 1

要说正宗的程序,应该是我写的第一个,但是我的第二个可以作为做第二道题的时候方便。。Top

19 楼penghaikun(三个代表)回复于 2005-01-18 14:06:31 得分 0

呵呵,既然大家这么热情,我也说出我的想法吧:  
  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前结帐!Top

20 楼penghaikun(三个代表)回复于 2005-01-18 14:10:29 得分 0

就是界面不是很友好吧了。但第一题目的标准答案是多少,我现在等大家的好消息呢,希望能提供第一题的标准答案N值。Top

21 楼jackyzgm()回复于 2005-01-18 16:49:51 得分 1

第一次得到符合条件的结果:3.141599999994786  
  得到此结果时的N的值:           272241  
  得到此结果前的N的最大值:   272239Top

22 楼giant216($贫下中农$)回复于 2005-01-18 17:25:56 得分 1

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

23 楼westarea(彩色的草原)回复于 2005-01-18 18:05:07 得分 3

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.1416Top

24 楼shan1119(大天使,卐~解!)回复于 2005-01-18 19:28:11 得分 1

没时间了,明天来学习Top

25 楼warren1999(warren1999)回复于 2005-01-18 19:43:56 得分 1

gzTop

26 楼harvardjl()回复于 2005-01-18 21:11:24 得分 1

关注Top

27 楼TzcLove_Ancen(臻程)回复于 2005-01-18 21:17:31 得分 1

学着,记着.Top

28 楼cyicecream(为了升仙(星)到处UP)回复于 2005-01-18 22:19:33 得分 1

今天18号,偶最后一个顶??Top

29 楼greenapple135(杉杉呜啦啦)回复于 2005-01-18 22:49:56 得分 1

太帅了,平时写题时从来没有关注过关于效率是否最优~  
  汗~Top

30 楼penghaikun(三个代表)回复于 2005-01-18 23:21:34 得分 0

结帐之前,我说出我的原来的算法,这样才算公平,以免有人说我乱要程序的。  
  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);  
  }  
  }Top

31 楼penghaikun(三个代表)回复于 2005-01-18 23:29:41 得分 0

各位未能领到分的.或分数不够所先前本人所言的,请与我关注我的帖子!会在哪里补分!Top

32 楼samkuang(执着前行)回复于 2005-01-18 23:29:51 得分 1

学习ingTop

33 楼mtu207(比猫大的猫)回复于 2005-01-18 23:33:33 得分 1

俺也做个记号。老虎到此一游!Top

34 楼prcgolf(小鸟)回复于 2005-01-19 13:35:39 得分 0

upTop

相关问题

  • 判断五子棋胜负条件的算法,求最优算法,一个月后结帐
  • 算法
  • 算法
  • 算法!
  • 算法
  • 算法...
  • 算法
  • 算法啊算法!!
  • SQL语言出错问题
  • 快速结帐

关键词

  • 算法
  • newpi
  • oldpi
  • pi
  • 结果
  • pii
  • 得到
  • 运算
  • cst2005
  • 时间

得分解答快速导航

  • 帖主:penghaikun
  • yulchina
  • iiop18
  • IEQQ
  • JAVA_3
  • xitianjile
  • hero1981
  • zyg158
  • greenmars2004
  • treeroot
  • syilo
  • jiangnanyuzi
  • jackyzgm
  • Pilot006
  • jackyzgm
  • drugon
  • jackyzgm
  • jackyzgm
  • jackyzgm
  • giant216
  • westarea
  • shan1119
  • warren1999
  • harvardjl
  • TzcLove_Ancen
  • cyicecream
  • greenapple135
  • samkuang
  • mtu207

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo