做到一道题目,要求计算圆周率第“100万”位。代码不能超过4KB的长度,不能用直接输出那一百万个数。也不能用无穷级数,那貌似太慢了,我只能用最多10S。
自己弄到个代码,可是精度不能确定,而且我的确没弄懂该程序的原理。
贴上:#include "stdio.h"
long long a =10000000,b,c =28000,d,e,f[78019909],g,flag=0;
main() {freopen("play.out","w",stdout);
long long i;
for (i = 0 ;i < c;i ++ )
f[i] = a / 5 ;
while (c != 0 )
{
d = 0 ;
g = c * 2 ;
b = c;
while ( 1 )
{
d = d + f[b] * a;
g -- ;
f[b] = d % g;
d = d / g;
g -- ;
b -- ;
if (b == 0 ) break ;
d = d * b;
}
c=c-3;
if(flag<1){printf("3.141");flag=4;}
if(flag>=4){printf( "%.4d" ,e + d / a);
flag=flag+7;}
if(flag>=10000){printf("\n %ld ",flag);return(0);}
e = d % a;
}
}
望神人解答,能让以上代码实现100万的输出并解释清楚。
若能自己写新的代码并解释清楚也可以。
谢谢
ç¨çæ¯å¦å¾çå ¬å¼ï¼ä¸é¢æ¯arctgå±å¼ç级æ°ã
è¿ä¸ªè¾åºæ²¡æå好ï¼ä¸ç»æ¯10ä½ï¼å¦æåé¢æ¯â0âå°±ä¼å°äºï¼è¦å®åä¸ä¸ã
Næ¯å®ä¹ ç®å¤å°ç»çï¼Nï¼1000 æ¶ N*10å°±æ¯10000ç»ï¼è¦ç®å°100ä¸ä½è¿ç§ç®æ³è¦å¥½é¿æ¶é´ï¼ä½æ¯è¿æ¯æç®åçç®æ³ä¹ä¸ã
ä¸é¢åæä¸ä¸ªé¨åï¼ç¬¬ä¸æ¯å®ä¹æ°ç»å
#define N 1000
#include "math.h"
#include "string.h"
main()
{
auto double a1,b1,b2,c1,d,i=1.0,q=-1.0;
auto double n,g,r=10000000000.0;
static double a[N+1],b[N+1],c[N+1];
auto char *str3,str1[15],strs1[11*N],*p_strs1;
auto long p,j,k=1,m=1;
do {
printf("input p= ");
scanf("%ld",&p);
} while(p<=0 && p>100);
p = p + 1;
b[1]=r*20.0,c[1]=239*r;
do
{ q=-q,a1=0,b1=0,c1=0;
for(j=m;j<=p;j++){c1=c[j]+c1*r,c[j]=floor(c1/57121),c1=c1-c[j]*57121;}
if (c[m]<1e-5) m++;
for(j=k;j<=p;j++){
a1=b[j]+a1*r,b[j]=floor(a1/25.0),a1=a1-b[j]*25.0;
d=b1*r+b[j]-c[j],b1=floor(d/i),a[j]=4*q*b1+a[j];
b1=d-b1*i;
}
if (b[k]<=1e-5) {
k++ ;
printf("k=%ld ",k);}
i = i + 2;
}while(m<=p);
do
{ q = -q, a1 = 0,b1 = 0;
for(j=k;j<=p;j++) {
a1=b[j]+a1*r,b2=floor(a1/25),b[j]=b2;
a1=a1-b2*25,d=b2+b1*r;
b1=floor(d/i),a[j]=a[j]+4*q*b1;
b1=d-b1*i;
}
if (b[k]<=1e-5) { k++;printf(" k= %ld",k);}
i = i + 2;
}while(k<=p);
printf("\n");
for(j=p;j>=1;j--){g=a[j]+n,n=floor(g/r),a[j]=g-r*n;}
for(j=1;j<p;j++) printf("%10.0f ",a[j]);
str3=strs1;
}
1989年美国哥伦比亚大学研究人员用克雷-2型和IBM-VF型巨型电子计算机计算出π值小数点后4.8亿位数,后又继续算到小数点后10.1亿位数,创下最新的纪录。至今,最新纪录是——法国一工程师将圆周率算到小数点后27000亿位亿位。
参考资料: