用循环:
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;}菜鸟献丑,请多指教
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;}菜鸟献丑,请多指教
{
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
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);
}
}
{
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
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前结帐!
这个判断:i>272230 是耍赖,怎么能知道这个i从272230开始,不能算好的结果来作为起始点,还不如直接设2772240呢。
这个判断:((pi_value+"").substring(0,7)).equals("3.14159") 效率太低。应该直接比较大小,这样效率会提高两个数量级。pi_value > 3.14159 && pi_value < 3.1416
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);
}
}