编了一个用字符串求圆周率的程序,但数组元素超过8以后内存占用就满格了,求大神指点》》》》》》》》》》》》》
主程序在最底部,思想是根据公式pi/4=1-1/3+1/5-1/7...+1/n,在本程序中当n超过8位时计算机内存占用就满了,不知是否因内存容量原因还是程序本身原因(n低于8位时程序运行无误),求大神指点。。。程序代码:
#include "stdio.h" #include "malloc.h" void add(int *a,int *b,int n)/*两大数相加*/ { int i; for(i=n-1;i>0;i--) { a[i-1]=(a[i]+b[i])/10+a[i-1]; a[i]=(a[i]+b[i])%10; } } void sub(int *a,int *b,int n)/*两大数相减*/ { int i; for(i=n-1;i>0;i--) { while(a[i]<b[i]) { a[i]=10+a[i]; a[i-1]--; a[i]=a[i]-b[i]; i--; } a[i]=a[i]-b[i]; } } int *mul(int *a,int t,int n)/*一大数与一个位数相乘*/ { int i; int m; int *re=(int *)malloc(n*sizeof(int)); for(i=0;i<n;i++) re[i]=0; for(i=n-1;i>0;i--) { re[i]=(a[i]*t)%10+re[i]; m=re[i]; re[i]=re[i]%10; re[i-1]=m/10; re[i-1]=a[i]*t/10+re[i-1]; } return re; } int num0(int *a,int n)/*前零个数*/ { int i=1; while(a[i]==0) i++; return i-1; } void reset(int *a,int n)/*复位(大数有效值前移至隔一零顶端)*/ { int i; int t; t=num0(a,n); if(t!=1) for(i=2;i+t-1<n;i++) { a[i]=a[i+t-1]; a[i+t-1]=0; } } void back1(int *a,int n)/*大数有效值后退一格*/ { int i; for(i=n-2;i>0;i--) { a[i+1]=a[i]; a[i]=0; } } int compare(int *a,int *b,int n)/*比较两大数大小,如果a<=b*,返回1。感觉这个程序太丑了,恳请哪位大神帮忙改下*/ { int i=1; int j; int t=0; while((a[i]<=b[i])&&(i<(n-1))) { if(a[i]!=b[i]) t=1; i++; } if((i==(n-1))&&(t==0)) { if(a[i]>b[i]) j=0; else j=1; } if((i==(n-1))&&(t!=0)) j=1; if(i!=(n-1)&&(t!=1)) j=0; if((i!=(n-1))&&(t==1)) j=1; return j; } int *div(int *a,int n)/*10^N/X*/ { int *de=(int*)malloc(n*sizeof(int)); int *poi; int t,i; int *re=(int*)malloc(n*sizeof(int));; de[0]=0,re[0]=0; de[1]=1,re[1]=0; for(i=2;i<n;i++) { de[i]=0; re[i]=0; } t=n-num0(a,n); reset(a,n); while(t<n)/*这一循环主要是*/ { re[t]=0;/*模仿手算步骤*/ poi=mul(a,re[t],n); while(compare(poi,de,n)) { re[t]++; poi=mul(a,re[t],n); } re[t]--; sub(de,mul(a,re[t],n),n); back1(a,n); t++; } return re; } void add2self(int *a,int n) { int i=n-1; a[i]=a[i]+2; for(;i>2;i--) { if(a[i]>9) { a[i-1]++; a[i]=a[i]-10; } } } int main()/*主程序*/ { int a[10]={0,0,0,0,0,0,0,0,0,1};/*X值,必须按此种格式*/ int re[10]={0,1,0,0,0,0,0,0,0,0}; int *b; int *a1=(int*)malloc(10*sizeof(int)); int i; int flag=-1; while(a[3]<9) { add2self(a,10);/*a每次自增2*/ for(i=0;i<10;i++) a1[i]=a[i]; b=div(a1,10); if(flag==1) { add(re,b,10); flag=-1; } else { sub(re,b,10); flag=1; } } b=mul(re,4,10); for(i=1;i<10;i++) printf("%d",b[i]); return 0; } /*感谢您看完本程序*/