答案 0 :(得分:7)
这似乎是基于Dik T. Winter's 160-byte C program来计算pi的前800位,扩展为更高的精度。
他的原始代码:
int a=10000,b,c=2800,d,e,f[2801],g;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);}
可以更容易地重写:
#include <stdio.h>
int main() {
int r[2800 + 1];
int i, k;
int b, d;
int c = 0;
for (i = 0; i < 2800; i++) {
r[i] = 2000;
}
for (k = 2800; k > 0; k -= 14) {
d = 0;
i = k;
for (;;) {
d += r[i] * 10000;
b = 2 * i - 1;
r[i] = d % b;
d /= b;
i--;
if (i == 0) break;
d *= i;
}
printf("%.4d", c + d / 10000);
c = d % 10000;
}
return 0;
}
在k
循环期间,这是计算数字:
其中Beeler et al. (1972)是pi的近似值:
详情请见此处:
答案 1 :(得分:5)
我会回答最后一个问题:“为什么输出长度为2800个字符?”
在代码的初始化行中,我们看到
c=9814
然后在for
循环的循环条件表达式中,我们看到
c-=14
因此,循环从每个循环中的c
减去14,从9814开始,并在c
达到零时停止。但我们发现9814 / 14
是701
。由于该终止条件在第一个循环开始之前执行,因此循环执行700
次。
for
循环的最后一部分,通常会增加循环变量,而不是执行
printf("%04d",e+d/a)
因此,每个循环中都会打印一个整数的4
个字符。打印4
次的700
个字符会导致打印2800
个字符。