π/4=1-1/3+1/5-1/7+1/9-1/11+…… 用以上公式c语言编程求50位圆周率? 下面是我写的程序,最多只能到7位

#include<stdio.h>#include<time.h>intc[1000]={0},g[1000]={0};intN=0;voidf(inta,intb){i... #include<stdio.h>
#include<time.h>
int c[1000]={0},g[1000]={0};
int N=0;
void f(int a,int b)
{ int i,j=0,z;
int d[1000],f[1000];
for(i=1;;i++)
{ d[i]=a/b;
f[++j]=a%b;
a=f[j]*10;
if(f[j]==0)
break;
if(i==1)
continue;
if(j>80)
break;
z=j;
while(--z)
if(f[j]==f[z])
break;
if(z==0)
continue;
else
{N=j-z;
break;
}
}
a=10000000,b=0;
int h;
i=0;
if(N==0)
{ for(h=2;h<=j;h++)
{b=d[h]*a+b;
if(a==1)
{ c[++i]=b;
b=0;
a=100000000;
}
a=a/10;
}
if((j-1)%8!=0)
c[++i]=b;
}
else
{ for(h=2;h<=z;h++)
{b=d[h]*a+b;
if(a==1)
{ c[++i]=b;
b=0;
a=100000000;
}
a=a/10;
}
int n;
n=z;
for(;;)
{ b=d[++n]*a+b;
if(n==j)
n=z;
if(a==1)
{ c[++i]=b;
b=0;
a=100000000;
}
a=a/10;
if(i==8)
break;
}
}
N=0;
}

void add()
{ int i,t,b=0;
for(i=8;i>=0;i--)
{ t=g[i]+c[i]+b;
if(t<=100000000)
{ g[i]=t;
b=0;}
if(t>100000000)
{ b=1;
g[i]=t%100000000;
}
}
}

void sub()
{int i,j,t;
for(i=8;i>=0;i--)
{ t=g[i]-c[i];
if(t>=0)
g[i]=t;
else
{ g[i]=t+100000000;
j=i;
--j;
g[j]=g[j]-1;
while(g[j]<0)
{ g[j]=100000000+g[j];
--j;
g[j]=g[j]-1;
}
}
}
}

void mul4()
{int i,t,b,a=0;
for(i=8;i>=0;i--)
{ t=g[i]*4+a;
b=t%100000000;
a=t/100000000;
g[i]=b;
}
}

void tatol()
{ int i,j,b=3;
f(2,3);
for(j=0;j<=8;j++)
g[j]=c[j];
for(j=0;j<=8;j++)
c[j]=0;
for(i=1;i<=100000;i++)
{ b=b+2;
f(1,b);
if(i%2!=0)
add();
if(i%2==0)
sub();
for(j=0;j<=8;j++)
c[j]=0;
}
mul4();
}
int main()
{ int i;
double tb;
tatol();
for(i=0;i<=8;i++)
printf("%d ",g[i]);
putchar('\n');
tb=clock();
tb=tb/CLOCKS_PER_SEC;
printf("%f\n",tb);
return 0;
}
以上的程序运行速度慢,而且精确位数少。希望大神能帮我改进改进,或用以上公式帮我写一个(也可以只给重要算法)。
很感谢大家的回答,但要精确到50位,一般把数据直接存变量一定是做不出来的。直接存 用double定义范围最多也只能存19位有效数据,而且那样做运行时间会很久很久。。。
展开
 我来答
衷衷咪N
2012-03-27
知道答主
回答量:13
采纳率:0%
帮助的人:16.5万
展开全部
这个公式精确度不大试试这个公式吧(收敛太慢了,下面的收敛比较快)
π/2=1+1/3+1/3*2/5+1/3*2/5*3/7+....
修改了你的程序编写出来的。
#include<stdio.h>
#include<time.h>
int c[2000]={0},g[2000]={0};
int N=0;
#define M 15
#define P 15
void f(int a,int b)
{ int i,j=0,z;
int d[1000],f[1000];
for(i=1;;i++)
{ d[i]=a/b;
f[++j]=a%b;
a=f[j]*10;
if(f[j]==0)
break;
if(i==1)
continue;
if(j>100)
break;
z=j;
while(--z)
if(f[j]==f[z])
break;
if(z==0)
continue;
else
{N=j-z;
break;
}
}
a=1000,b=0;
int h;
i=0;
if(N==0)
{ for(h=2;h<=j;h++)
{b=d[h]*a+b;
if(a==1)
{ c[++i]=b;
b=0;
a=10000;
}
a=a/10;
}
if((j-1)%8!=0)
c[++i]=b;
}
else
{ for(h=2;h<=z;h++)
{b=d[h]*a+b;
if(a==1)
{ c[++i]=b;
b=0;
a=10000;
}
a=a/10;
}
int n;
n=z;
for(;;)
{ b=d[++n]*a+b;
if(n==j)
n=z;
if(a==1)
{ c[++i]=b;
b=0;
a=10000;
}
a=a/10;
if(i==M)
break;
}
}
N=0;
}

void add()
{ int i,t,b=0;
for(i=P;i>=0;i--)
{ t=g[i]+c[i]+b;
if(t<=10000)
{ g[i]=t;
b=0;}
if(t>10000)
{ b=1;
g[i]=t%10000;
}
}
}

void mul(int k[])
{ int i,j,b,t,z=0,h,n,a=0,l=0,y;
int d[1000]={0},f[1000]={0},p[1000]={0};
i=0;
while(c[i]==0)
i++;
a=i;
j=0;
while(k[j]==0)
j++;
l=j;
for(i=M;i>=a;i--)
{ b=0,h=1;
for(j=M;j>=l;j--)
{t=c[i]*k[j]+b;
d[h++]=t%10000;
b=t/10000;
}
if(b!=0)
d[h]=b;
else
h--;
z++,b=0;
n=z;
for(j=1;j<=h;j++,n++)
{ t=f[n]+d[j]+b;
f[n]=t%10000;
b=t/10000;
}
if(b!=0)
f[n]=b;
else
n--;
}
j=0;
if(f[n]/1000!=0)
j=j+4;
else if(f[n]/100!=0)
j=j+3;
else if(f[n]/10!=0)
j=j+2;
else if(f[n]/1!=0)
j++;
n--;
j=j+n*4;
y=M*8-j;
n++;
j=y/4;
for(i=1;i<=j;i++)
c[i]=0;
for(;i<=M;i++)
c[i]=f[n--];

}

void mul2()
{int i,t,b,a=0;
for(i=P;i>=0;i--)
{ t=g[i]*2+a;
b=t%10000;
a=t/10000;
g[i]=b;
}
}

void total()
{ int i,j,a=1,b=3;
int h[1000]={0};
f(1,3);
add();
for(j=0;j<=P;j++)
h[j]=g[j];

for(i=1;i<=500;i++)
{ a++;
b=b+2;
for(j=0;j<=P;j++)
c[j]=0;
f(a,b);
mul(h);
for(j=0;j<=P;j++)
h[j]=c[j];
add();
}
g[0]=g[0]+1;
mul2();
}

int main()
{ int i;
double clk;
total();
for(i=0;i<=13;i++)
printf("%d ",g[i]);
putchar('\n');
clk=clock();
printf("time=%lf\n" , clk/CLOCKS_PER_SEC );
return 0;
}
追问
好吧!可能那个公式要编50位不大可能。你的程序我看了,看得明白。我再等等有没有大神出现。没有就采纳你吧。。。。
kaixingui2012
2012-03-22 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:7762万
展开全部
//用这个公式算50位是不是有点难了?!,自己写的小代码,供参考吧
#include <stdio.h>
#include <math.h>
#include <time.h>

int main(void)
{
register double dPai=0,d=0;
register long i;
register int flag=1;
clock_t clk=0;

i=0;
do {
d=dPai ;
dPai += flag*1.0/(2*i+1);
flag = -flag ;
i++ ;
} while ( fabs(d-dPai) > 1e-10 );//1e-10就需要很长时间,不知道1e-50会需要多久

clk=clock();
printf("i=%ld , pai=%.50lf\n" , i , 4*dPai );
printf("time=%lf\n" , clk*1.0/CLOCKS_PER_SEC );
return 0;
}
追问
这个公式也许不能算出50位,可能像你说的,很难!!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ff_i
2012-03-22
知道答主
回答量:23
采纳率:0%
帮助的人:16.1万
展开全部
少年,七是个非常神奇的数字,要知道,浮点型数据打印输出的话要是不指定格式,某人保留就是七位,换句话说,我虽然没看你的程序,但是我觉得你可以吧printf语句里的%f改一改,去搜一下c格式话字符串,怎么样保留多少位
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
shieliying
2012-03-22
知道答主
回答量:5
采纳率:0%
帮助的人:3.8万
展开全部
你的代码好复杂!
这是一个级数逼近的习题,你可以用循环或者递归.
所谓逼近就是近似值的准确度最大化,也就是会影响总值的项式值接近0(n<=10e-x),x越大精度越大.
考虑一下数据的存储和各项的变化规律.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友5ef623c
2012-03-22 · TA获得超过151个赞
知道小有建树答主
回答量:164
采纳率:100%
帮助的人:131万
展开全部
神呢 你写那么长 要是保留7位的话要这样输出:
printf(“%.7lf”);//.7很重要啊...你的程序没有看只是看了输出 还是有时间了我帮你看看那..
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式