编了一个用字符串求圆周率的程序,但数组元素超过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;
}
/*感谢您看完本程序*/







