圆周率计算任意多C语言
我写了10000多位,代码太多,这里不一一列举。让我给你出个主意:
固定长度的字节数组定义为“大整数类型”,长度为BI_SIZE,数组的数字0是最低的8位,后面是较高的8位,以此类推。
考虑到计算过程中的溢出问题,BI_SIZE要尽量大,但不能太大,否则计算会很慢。
#定义
双尺寸
128
定义小数点后的十进制数字PI_NUM,略大于100。
#定义
PI_NUM
103
有几个这样的阵列。例如,计算函数中使用的工作寄存器如下:
uint8_t
R0计算圆周率的c语言程序 #包含stdio.h
#定义L 10000 //求10000位圆周率值
#定义N L/4 1
// L是位数,n是数组的长度。
/*圆周率后面的小数位数是无穷的。如何用计算机计算这个无穷小数位,是一些数学家和程序员感兴趣的。这里介绍一个结合大数运算计算指定位数圆周率的公式。
约翰·沃利斯圆周率公式:
//详细见网站介绍:
PI =[16/5-16/(3 * 53)16/(5 * 55)-16/(7 * 57)......] - [4/239 - 4/(3*2393) 4/(5*2395) - 4/(7*2397) ......]
*/
void add ( int*,int*,int *);
void sub ( int*,int*,int *);
void div ( int*,int,int *);
int main ( void)
{
int s[N 3]= { 0 };
int w[N 3]= { 0 };
int v[N 3]= { 0 };
int q[N 3]= { 0 };
int n =(int)(L/1.39793 1);
int k;
w[0]= 16 * 5;
v[0]= 4 * 239;
for(k = 1;k = n;k)
{
//应用公式
div ( w,25,w);
div ( v,239,v);
div ( v,239,v);
sub ( w,v,q);
div ( q,2*k-1,q);
If (k%2) //奇数项
add ( s,q,s);
Else //偶数项
sub ( s,q,s);
}
printf ( "%d . ",s[0]);
for(k = 1;k N;k)
printf ( "d ",s[k]);
printf(" \ n ");
返回0;
}
void add ( int *a,int *b,int *c)
{
int i,进位= 0;
for(I = N ^ 1;I = 0;我-)
{
c[i] = a[i] b[i]进位;
if ( c[i] 10000)
进位= 0;
Else //进位
{
c[I]= c[I]-10000;
进位= 1;
}
}
}
void sub ( int *a,int *b,int *c)
{
int i,borrow = 0;
for(I = N ^ 1;I = 0;我-)
{
c[I]= a[I]-b[I]-borrow;
如果(c[i] = 0)
borrow = 0;
Else //不好意思
{
c[I]= c[I]10000;
borrow = 1;
}
}
}
Void div (int *a,int b,int *c) // b是除数。
{
int i,tmp,remain = 0;
for(I = 0;I = N ^ 1;我)
{
tmp = a[i]剩余;
c[I]= tmp/b;
remain =(tmp % b)* 10000;
}
}
c语言计算圆周率 #包含stdio.h
双事实(整数)
{
double res = 1.0
for(int I = 1;I = n;我)
RES * = I;
返回res
}
double multi(int n)
{
double res = 1.0
for(int I = 1;I = n;i = 2)
RES * = I;
返回res
}
int main()
{
double sum=1.0,item=1.0,EPS = 1e-6;
for(int I = 1;item = eps我)
{
item = fact(I)/multi(2 * I 1);
sum = sum项;
}
printf("PI=%0.5lf\n ",sum * 2);
返回0;
}
//所以可以得到3.14159。
用C语言写一个计算圆周率的程序。用户输入指定的位数,计算到指定的数(精度不够可以用整数)。 #包含“stdio.h”
#包含stdlib.h
#包含字符串. h
int main(int argc,char *argv[]){
int a,b,c,d,e,f[2801],g,I,n;
char pi[801]= " ",t[5]= " ";
for(a=10000,b=0,c = 2800b-c;f[b]= 2000);//a/5
for(I = e = 0;d=0,g = c * 2;c-=14,e=d%a){
for(b = c;d =f[b]*a,f[b]=d% - g,d/=g -,-b;d * = b);
n=e d/a,t[0]= t[1]= t[2]= t[3]= ' \ 0 ';
n10?t[0]=t[1]=t[2]='0 ',i=3 : n100?t[0]=t[1]='0 ',i=2 : n1000?t[0]='0 ',I = 1:I = 0;
itoa(n,t i,10);
strcat(pi,t);
}
printf("请输入长度n(int 0n800)...\ nn = ");
if(scanf("%d ",n)!=1 || n1 || n800){
printf("输入错误,退出...\ n ");
返回0;
}
for(I = 0;在;printf("%c ",pi[I]);
printf(" \ n ");
返回0;
}
代码格式和运行样本图片:
最后更新于 2023-10-13 06:52:06 并被添加「」标签,已有 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
相关文章