用C语言编程求圆周率,要求用命令行实现,计算到小数点后2000位

问题在2000位这么多怎么实现。
给出整个调试正确的程序我讲追加200积分。
我要请你们解决的就是数组太长的问题。再给出程序的时候希望能在程序中关键部位添加注释,因为我的C不太好,谢谢。

/*
* 编译成可执行文件后,在DOS提示符下执行:
* 如果带一个命令行参数,则该值为要计算的位数;
* 如果还带有第二个参数,则使用stomer公式计算。
* 代码如下:
*/

#include <stdio.h>
#include <stdlib.h>

void main(int argc,char *argv[])
{
long *pi,*t,m,n,r,s;
int t0[][3] = {48,32,20,24,8,4},k0[][3] = {1,1,0,1,1,1},n0[][3] = {18,57,239,8,57,239};
int d,i,j,k,p,q;
d=(argc>1)?(((i = atoi(argv[1]))<0)?0:i):1000;
q=(argc>2)?1:0;
printf("%s\n\n", "Nature (R) Pi value compute Program (C) Tue 2005.11.10");
printf("pi= %s%d * arctg(1/%d) %s %d * arctg(1/%d) %s %d * arctg(1/%d) [%s]\n",
k0[q][0] ? "" : "-", t0[q][0], n0[q][0], k0[q][1] ? "+" : "-", t0[q][1],
n0[q][1], k0[q][2] ? "+" : "-", t0[q][2], n0[q][2], q ? "Stomer" : "Gauss");
if((t = (long *)calloc((d += 5) + 1, sizeof(long))) == NULL)
return 1;
if((pi = (long *)calloc(d + 1, sizeof(long))) == NULL)
return 2;
for(i = d; i >= 0; i--) pi[i] = 0;
for(p = 0; p < 3; p++)
{
for(k=k0[q][p], n=n0[q][p], t[i=j=d]=t0[q][p], i--; i >= 0; i--)
t[i] = 0;
for(r = 0, i = j; i >= 0; i--)
{
r = (m = 10 * r + t[i]) % n;
t[i] = m / n;
k ? (pi[i] += t[i]) : (pi[i] -= t[i]);
}
while (j > 0 && t[j] == 0)
j--;
for (k = !k, s = 3, n *= n; j > 0; k = !k, s += 2)
{
for (r = 0, i = j; i >= 0; i--)
{
r = (m = 10 * r + t[i]) % n;
t[i] = m / n;
}
while (j > 0 && t[j] == 0)
j--;
for (r = 0, i = j; i >= 0; i--)
{
r = (m = 10 * r + t[i]) % s;
m /= s;
k ? (pi[i] += m) : (pi[i] -= m);
}
}
}
for (n = i = 0; i <= d; pi[i++] = r)
{
n = (m = pi[i] + n) / 10;
if ((r = m % 10) < 0)
r += 10, n--;
}
printf("pi= %ld.", pi[d]);
for (i = d - 1; i >= 5; i--)
printf("%ld%s", pi[i], ((m = d - i + 5) % 65) ? ((m % 5) ? "" : " ") : "\n");
printf("%sDIGITS: %d\n", (m % 65) ? "\n" : "", d - 5);
return 2;getch();
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-06-21
不过用tc编译的时候会提示错误 因为数组太长
最好找别的编译器
#include "stdio.h"
#include "conio.h"
long a=10000, b, c=28000, d, e, f[28010], g;

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 ) ;
getch( );
return;
}

/*
* 编译成可执行文件后,在DOS提示符下执行:
* 如果带一个命令行参数,则该值为要计算的位数;
* 如果还带有第二个参数,则使用stomer公式计算。
* 代码如下:
*/

#include <stdio.h>
#include <stdlib.h>

void main(int argc,char *argv[])
{
long *pi,*t,m,n,r,s;
int t0[][3] = {48,32,20,24,8,4},k0[][3] = {1,1,0,1,1,1},n0[][3] = {18,57,239,8,57,239};
int d,i,j,k,p,q;
d=(argc>1)?(((i = atoi(argv[1]))<0)?0:i):1000;
q=(argc>2)?1:0;
printf("%s\n\n", "Nature (R) Pi value compute Program (C) Tue 2005.11.10");
printf("pi= %s%d * arctg(1/%d) %s %d * arctg(1/%d) %s %d * arctg(1/%d) [%s]\n",
k0[q][0] ? "" : "-", t0[q][0], n0[q][0], k0[q][1] ? "+" : "-", t0[q][1],
n0[q][1], k0[q][2] ? "+" : "-", t0[q][2], n0[q][2], q ? "Stomer" : "Gauss");
if((t = (long *)calloc((d += 5) + 1, sizeof(long))) == NULL)
return 1;
if((pi = (long *)calloc(d + 1, sizeof(long))) == NULL)
return 2;
for(i = d; i >= 0; i--) pi[i] = 0;
for(p = 0; p < 3; p++)
{
for(k=k0[q][p], n=n0[q][p], t[i=j=d]=t0[q][p], i--; i >= 0; i--)
t[i] = 0;
for(r = 0, i = j; i >= 0; i--)
{
r = (m = 10 * r + t[i]) % n;
t[i] = m / n;
k ? (pi[i] += t[i]) : (pi[i] -= t[i]);
}
while (j > 0 && t[j] == 0)
j--;
for (k = !k, s = 3, n *= n; j > 0; k = !k, s += 2)
{
for (r = 0, i = j; i >= 0; i--)
{
r = (m = 10 * r + t[i]) % n;
t[i] = m / n;
}
while (j > 0 && t[j] == 0)
j--;
for (r = 0, i = j; i >= 0; i--)
{
r = (m = 10 * r + t[i]) % s;
m /= s;
k ? (pi[i] += m) : (pi[i] -= m);
}
}
}
for (n = i = 0; i <= d; pi[i++] = r)
{
n = (m = pi[i] + n) / 10;
if ((r = m % 10) < 0)
r += 10, n--;
}
printf("pi= %ld.", pi[d]);
for (i = d - 1; i >= 5; i--)
printf("%ld%s", pi[i], ((m = d - i + 5) % 65) ? ((m % 5) ? "" : " ") : "\n");
printf("%sDIGITS: %d\n", (m % 65) ? "\n" : "", d - 5);
return 2;getch();
}
第2个回答  2008-06-20
不过用tc编译的时候会提示错误 因为数组太长
最好找别的编译器
#include "stdio.h"
#include "conio.h"
long a=10000, b, c=28000, d, e, f[28010], g;

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 ) ;
getch( );
return;
}
第3个回答  2008-06-24
B-S 那些盗用版权者
第4个回答  2008-06-21
495196274 - 魔法学徒 一级

用C语言编程求圆周率,要求用命令行实现,计算到小数点后2000位
\/ 编译成可执行文件后,在DOS提示符下执行:如果带一个命令行参数,则该值为要计算的位数;如果还带有第二个参数,则使用stomer公式计算。代码如下:\/ include <stdio.h> include <stdlib.h> void main(int argc,char *argv[]){ long *pi,*t,m,n,r,s;int t0[][3] = {48,32,20,24...

C语言求圆周率
&f)==1) { pi=0; i=1; sign=1; do { pi+=sign*1.0\/i; }while(1.0\/i>=f&&(sign=-sign)&&(i+=2)); printf("%lf\\n",pi*4.0); } return 0;}

怎样用C语言计算圆周率后2000位
x =sin((360\/(6*n))\/2)*r; 周长d = 2*x*6*n; 所以圆周率 pi = d\/r ;就是这样算的,你如果是这样算的,你想要2000位,我想你可以试试在计算结果出来之后直接将装换成字符数表示就可以表示两千位了呀。

用C语言编写一个求圆周率的程序
楼上的那个 i<400这个400改成更大的数精确度会高点,还有printf后改成%.50lf\\n可以算到小数点后50位,这个50也是可以改的。外加一句,一般电脑很难算到50位

能用C语言或C#语言算圆周率吗?
是的,C 语言和 C# 语言都可以用来计算圆周率。多边形法是一种常用的求圆周率的方法,其基本思路是将一个正多边形内接于单位圆上,通过不断增加多边形的边数,逐渐逼近圆的周长和面积。具体来说,我们可以使用如下的 C 语言或 C# 语言代码实现:```c include <stdio.h> include <math.h> int main...

谁能给个圆周率的C语言程序
define PI_BUFFLEN (PI_DIGITS*14\/4)unsigned long b,c,d,e,f[PI_BUFFLEN+1],g, n;int main(){ for(b=0;b!=PI_BUFFLEN;b++) f[b]=2000;for (e=0,c=PI_BUFFLEN;c;c-=14){ d=0;for(b=c;b;b--){ d += f[b]*10000;g = b*2...

用c语言求出圆周率,这是一个神奇的程序。求解释?
这个比较出名的程序,三行语句求PI 按公式PI\/2 = ∑ (n! \/ (2n+1)!!) 计算Pi 计算2800项就可以精确到小数点后800位 正常的写法 include "stdio.h"long b,c,d,e,f[2801];void main(){ for (int i = 0; i < 2800; i++) f[i] = 2000; f[2800] = 0; for (c = ...

C语言编程求圆周率
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=...

求一个圆周率C语言程序
for(b=c;d+=f[b]*a,f[b]=d%--g,d\/=g--,--b;d*=b);} 网上广为流传的求圆周率的代码,能求800位。它能求的更精确吗?改哪几个变量?这是近似算法还是一种求派的精确算法?我看不明白,谁能解释一下?参考资料:http:\/\/zhidao.baidu.com\/question\/47106674.html ...

怎么编个程序,输出圆周率的小数点后1000位,(想要多少就多少)
for(b=c;d+=f[b]*a,f[b]=d%--g,d\/=g--,--b;d*=b);} \/* (本程式可算出pi值连小数点前共800位)(本程式录自sci.math FAQ,原作者未详)*\/ 咋一看,这程序还挺吓人的。别慌,下面就告诉你它是如何做到的,并且告诉你写怪异C程序的一些技巧。^_^ 展开化简 我们知道,在C语言中...

相似回答