Здравствуйте.
Есть программа, написанная Диком Т. Винтером (Dik T. Winter at CWI) на Си всего 160-ю символами, но вычисляющая 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);}
в таком виде мало что понятно, я переписал в более доступной форме:
Код:
int a = 10000;
int b = 0;
int c = 2800;
int d = 0;
int e = 0;
int f[2801];
int g = 0;
int main()
{
//заполняет массив значением à/5 = 2000
for (b = 0; b < c; b++) f[b] = a/5;
//цикл вычислений
while (g = c * 2)
{
d = 0;
for (b = c; b > 1; b--)
{
d += f[b] * a;
--g; f[b] = d % g;
d /= g; g--;
d *= b;
}
//выводит на экран по 4 цифры, например: 3141
printf("%.4d", e + d/a);
c -= 14;
e = d % a;
}
getch();
return 0;
}
Программа работает и за время менее секунды вычисляет все свои положенные 800 знаков:
Если кто может, объясните, на чем основан принцип действия данного алгоритма, какой у него физический смысл - почему он вообще вычисляет Пи, почему именно 800 знаков, а не 1000 например и т.д.