1楼的太复杂了,不太明白。主要是最核心的这一句功能没看懂
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);
这一句是用什么公式算圆周率的呢?
主循环是变量c从2800每次减14一直减到零,共循环200次,每次输出圆周率的4位,因此能输出圆周率800位。调节2800(以14的整倍数调整)可以控制圆周率最终的输出位数。
可是14是什么概念呢,我先试了一下将 c-=14; 改成 c-=13; 同时相应地对变量c的山迅初始化按比例将 c=2800 改成 c=2600
发现输出结果的后几位算错了,然后我类似地再将 13 依次改为 12、11、10……
发现输出结果后面的位数算错的越来越多。
然袜唯洞后,我又将 14 分别改为 15、16、17……(同理变量c的初始化分别为 3000、3200、3400……)
这样的结果却没有算错(大于或等于14的结果都是一样的)。
于是告枯我猜测 14 这个数可能是计算精度的最低限制,可为什么是14呢?谁来解释一下?
___________________
顺便研究了一下2楼的,方法简单易理解。只是用浮点算的话似乎算不到那么精确的位数。输出只显示了十来位后面的就全是零了
#include "stdio.h"
#include
long a=10000,b=0,c=2800,d,e=0,f[2801],g;
void main()
{
for(;b-c;)
f[b++]=a/5;
for(;d=0,g=c*2;)
{
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);
c-=14;
if(e+d/a==3141)
{
printf("Pai=%.3f",(e+d/a)*1.0/1000);
e=d%a;continue;
}
if(e+d/a<10)
printf("000%d",e+d/a);
else if(e+d/a<100)
printf("00%d",e+d/a);
else if(e+d/a<1000)
printf("氏答戚0%d",e+d/a);
else printf("歼陵%d",e+d/a);
e=d%a;
}
printf("\n");
getch();
}
这个将近举信1000吧
你可以参考一下
#include
long a = 10000,b,c=2800,d,e,f[2801],g,l,hj;
void main()
{for(;b-c;)f[b++]=a/枣做5;
for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);scanf("%l",&l);printf("%l",l);scanf("%d",&hj);
}
很短
不过算到的位凳卜衡数很多弊盯
试试吧
首先你要知道它是乱陵这样的算法.
在高等数学的<<数学分析>>中的傅立叶级数那章就讲了其算法:
pai=4(1-1/3+1/5-1/7+.......)
这样你就可以编程了
#include "stdio.h"
#include
viod main()
{int s;
long double pi, n ,t;
t=1;
pi=0;n=1.0;
s=1;
while(fabs(t)>1e-6)
{
pi=pi+t;
n=n+2;
s=-s;
t=s/n;
}
pi=pi*4;
printf("pi=%1024.1000f\n",pi);
}
这春旁个你看看行不
pai=4(1-1/3+1/5-1/7+1/9.......)
只要知道了这个 就好办;