小菜一碟,来和大家讨论一下最佳算法,来者有分,答者重分,言出必行!2005.1.18日之前结帐~分数不够可再加!
有两道很菜的题目:如果不讲究效率,我都可以做出来,但要求效率尽量高或算法尽量优。所以请路人和高手指教。
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




