thuzhangga 2016-01-28 15:45 采纳率: 0%
浏览 1480
已采纳

程序运行到某个过程停止?

代码如下:

#include"stdlib.h"
#include"malloc.h"
int *add(int *a,int *b)
{
    int digit1=_msize(a)/4;
    int digit2=_msize(b)/4;
    int digit=_msize(a)/4>=_msize(b)/4?_msize(a)/4:_msize(b)/4;
    printf("enter:a=");
    for(int i=0;i<digit1;i++)
        printf("%d",a[i]);
    printf(" b=");
    for(int i=0;i<digit2;i++)
        printf("%d",b[i]);
    int *re=(int *)calloc(digit+1,4);
    int *d=(int *)calloc(digit+1,4);
    int *e=(int *)calloc(digit1,4);
    for(int i=0;i<digit2;i++)
        e[i]=b[i];
    for(int i=0;i<digit;i++)
    {
        d[i+1]=(a[i]+e[i])/10;
        re[i]=(a[i]+e[i]+d[i])%10;
    }
    re[digit]=d[digit];
    free(d);
    free(e);
    if(re[digit]==0)
    {
        realloc(re,digit*4);
        printf(" out: ");
        for(int i=0;i<digit;i++)
            printf("%d",re[i]);
        printf("\n");
        return re;
    }
    else 
    {
        printf(" out:");
        for(int i=0;i<digit+1;i++)
            printf("%d",re[i]);
        printf("\n");
        return re;
    }
}
void main()
{
    int *fr=(int *)malloc(sizeof(int));
    fr[0]=1;
    int *af=(int *)malloc(sizeof(int));
    af[0]=1;
    while(true)
    {
        int *temp=fr;
        fr=af;
        af=add(af,temp);
        if(_msize(af)/4==1000)
        {
            for(int j=0;j<(_msize(af)/4);j++)
            printf("%d",af[j]);
            break;
        }
    }
}

任务是找出首个达到1000位的斐波那契数。
数太大,不可能直接操作,我用数组来表示数,方便起见我将数倒着存入数组。
但是呢我运行了几次,前面都没问题,运行到814491和393021(对应数为194481和1210393)就卡住不动了~求问怎么回事呢?

  • 写回答

3条回答

  • threenewbee 2016-01-28 21:46
    关注
     #include"stdio.h"
    #include"stdlib.h"
    #include"malloc.h"
    #include"string.h"
    
    void Add(char a[],char b[],char d[])
    {
        char c[1200];
        int lena=strlen(a),lenb=strlen(b);
        int i,len;
        len=lena>lenb?lena:lenb;
        len++;
        c[0]='\0';
        for(i=1;i<=len;i++)c[i]='0';
        for(i=1;i<=lena;i++)c[i]+=a[lena-i]-48;
        for(i=1;i<=lenb;i++)c[i]+=b[lenb-i]-48;
        for(i=0;i<=len;i++)
            if(c[i]>57)
        {
                c[i]-=10;
                c[i+1]++;
            }
    
        for(i=len;i>1;i--)
            if(c[i]==48)len--;
            else break;
         for(i=0;i<=len;i++)
            d[i]=c[len-i];
    }
    
    void main()
    {
        char a[1200];
        char b[1200];
        char c[1200];
        a[0] = '1';
        a[1] = '\0';
        b[0] = '1';
        b[1] = '\0';
        int i = 3;
        while (true)
        {
            Add(a, b, c);
            if (strlen(c) >= 1000) break;
            i++;
            strcpy(a, b);
            strcpy(b, c);
        }
        printf("%d\n", i);
        printf("%s\n", c);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)