| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 612 人关注过本帖
标题:编了一个用字符串求圆周率的程序,但数组元素超过8以后内存占用就满格了,求 ...
只看楼主 加入收藏
扬州笑哈哈
Rank: 2
等 级:论坛游民
帖 子:26
专家分:34
注 册:2013-3-1
结帖率:100%
收藏
 问题点数:0 回复次数:1 
编了一个用字符串求圆周率的程序,但数组元素超过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;
}
/*感谢您看完本程序*/
搜索更多相关主题的帖子: 主程序 内存 圆周率 字符串 
2013-04-07 14:40
扬州笑哈哈
Rank: 2
等 级:论坛游民
帖 子:26
专家分:34
注 册:2013-3-1
收藏
得分:0 
下面是最后的改正的程序,,,内存占用问题解决了,,,但运行时间太长,,,理论上可算任意大位数,,,后来看了于华大神的程序,,,惭愧,,,结贴吧
程序代码:
#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;
    }
    free(b);
}


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];
    }
    free(b);
}


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))
        {
            free(poi);
            re[t]++;
            poi=mul(a,re[t],n);
        }
        free(poi);
        re[t]--;

        sub(de,mul(a,re[t],n),n);
        back1(a,n);
        t++;
    }
    free(de);
    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[11]={0,0,0,0,0,0,0,0,0,0,1};/*X值,必须按此种格式*/
    int re[11]={0,1,0,0,0,0,0,0,0,0,0};
    int *b;
    int *a1=(int*)malloc(11*sizeof(int));
    int i;
    int flag=-1;
   
    while(a[4]<9)
    {
        add2self(a,11);
        for(i=0;i<11;i++)
            a1[i]=a[i];
        b=div(a1,11);
        if(flag==1)
        {
        add(re,b,11);
       
        flag=-1;
        }
        else
        {
            sub(re,b,11);
            flag=1;
           
        }
    }
    b=mul(re,4,11);

   
    for(i=1;i<11;i++)
     printf("%d",b[i]);
    return 0;
}
/*感谢您看完本程序*/


很多事不是看你做没做,而是看你能做多久
2013-04-07 21:06
快速回复:编了一个用字符串求圆周率的程序,但数组元素超过8以后内存占用就满格 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025866 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved