标题:大数相加的算法找错误
只看楼主
lwlls668
Rank: 2
等 级:论坛游民
帖 子:59
专家分:72
注 册:2010-4-9
结帖率:100%
已结贴  问题点数:30 回复次数:4 
大数相加的算法找错误
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int t;
char* getnum(char*p)// 输入字符串
{
    int i=0;

    p=(char*)malloc(sizeof(char));//开辟一个区间先
    while ((p[i++]=getchar())!='\n')//判断 并 输入p[i]
    {
        p=(char*)realloc(p,(i)*sizeof(char));//
    }
    p[i]='\0';  //把最后一项 变成'\0’  这个我还是不懂
    return p;
}
int* bigadd(int*num,char*p1,char*p2)//相加
{
    int n=0;
    int ch1_n,ch2_n;
    ch1_n=strlen(p1)-1;//判断p1的长度   减去多分配的一个区间
    ch2_n=strlen(p2)-1;//判断p2的长度   减去最后那个多余无值区间
    num=(int*)malloc(sizeof(int));
    while (ch1_n>=0||ch2_n>=0)
    {
        ch1_n--; //其实这个判断可以省略
        ch2_n--;
        if (ch1_n>=0&&ch2_n>=0) num[n]=(p1[ch1_n]-'0')+(p2[ch2_n]-'0');//如果两个都还有数没有加
        else  if (ch1_n<0)num[n]=p2[ch2_n]-'0';//如果p1已经取完数
        else  num[n]=p1[ch1_n]-'0'; //p2取完数
        num=(int*)realloc(num,(n+2)*sizeof(int));//只要两个不同时已经取完数 就要继续分配一个区间,那么最后有一个多余
        n++;   
    }
    num[n]=0;//把最后那区域赋值给0  预防上一位也要进位
    t=n;//先记下num一共多少位。
    return num;

}
int* carry(int*num)  //进位
{
    for (int n=0;n<=t;) //从第一位开始到第t位 一直进位
    {
        while (num[n]>=10)//当num的值大于10时候
        {
            num[n++]-=10;//  num自减10;
            num[n]+=1;//   下一位数+1;
            continue;
        }
        n++;//判断下一位数
    }
    return num;  //返回num指针
}
void printnum(int*num)//输出num的数组
{
   
    for (;t>=0;t--)
        printf("%d   ",num[t]);
}
main()
{
    int *num;
    char*p1,*p2;
    p1=getnum(p1);
    p2=getnum(p2);
    num=bigadd(num,p1,p2);
    printnum(num);
}

请问哪儿错了   错是肯定错了的  只是我没发现
请在这个基础上改改   谢谢
搜索更多相关主题的帖子: 大数 算法 相加 
2010-09-19 23:24
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
得分:30 
我发现一个问题~就是那个进位函数一直没有调用啊!主函数里没有!自定义函数里也没调用它
2010-09-20 08:42
lwlls668
Rank: 2
等 级:论坛游民
帖 子:59
专家分:72
注 册:2010-4-9
得分:0 
回复 2楼 遮天云
额  抱歉,那个函数,我把它也给忘了。这个只是我用来一个一个地检查用的  还没有用到。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int t;
char* getnum(char*p)// 输入字符串
{
    int i=0;

    p=(char*)malloc(sizeof(char));//开辟一个区间先
    while ((p[i++]=getchar())!='\n')//判断 并 输入p[i]
    {
        p=(char*)realloc(p,(i+1)*sizeof(char));//
    }
    p[i]='\0';  //把最后一项 变成'\0’  这个我还是不懂
    return p;
}
int* bigadd(int*num,char*p1,char*p2)//相加
{
    int n=0;
    int ch1_n,ch2_n;
    ch1_n=strlen(p1);//判断p1的长度   减去多分配的一个区间
    ch2_n=strlen(p2);//判断p2的长度   减去最后那个多余无值区间
    num=(int*)malloc(sizeof(int));
    while (ch1_n>=0||ch2_n>=0)
    {
        --ch1_n; //其实这个判断可以省略
        --ch2_n;
        if (ch1_n>=0&&ch2_n>=0) num[n]=(p1[ch1_n]-'0')+(p2[ch2_n]-'0');//如果两个都还有数没有加
        if (ch1_n<0&&ch2_n>=0)num[n]=p2[ch2_n]-'0';//如果p1已经取完数
        if(ch1_n>=0&&ch2_n<0)num[n]=p1[ch1_n]-'0'; //p2取完数
        num=(int*)realloc(num,(n+2)*sizeof(int));//只要两个不同时已经取完数 就要继续分配一个区间,那么最后有一个多余
        n++;   
    }
    t=n-1;    //为什么是t=n-1 ??  不是一共分配了n+1个区间吗?
    num[t]=0;//把最后那区域赋值给0  预防上一位也要进位
    //先记下num一共多少位。
    return num;
    }
int* carry(int*num)  //进位
{   
    for (int n=0;n<=t;) //从第一位开始到第t位 一直进位  帮我看看这个n<=t 有没有错
    {
        while (num[n]>=10)//当num的值大于10时候
        {
            num[n++]-=10;//  num自减10;
            num[n]+=1;//   下一位数+1;
            continue;
        }
        n++;//判断下一位数
    }
    return num;  //返回num指针
}
void printnum(int*num)//输出num的数组
{
        t=(num[t]==0)?t-1:t;
        while(t>0)       //为什么不是t>=0 ??  num[0]q去哪了?
        {printf("%d",num[t]);
          t--;
        }
}
main()
{
    int *num;
    char*p1,*p2;
    p1=getnum(p1);
    p2=getnum(p2);
    num=bigadd(num,p1,p2);
    printnum(carry(num));
}

这个是昨晚我自己再随便凑数 凑了一下   结果似乎还可以   但标有颜色的地方我不懂为什么要这样。
可以的话帮我看看。  如果还有哪儿是错了的   请帮我指出  谢谢
2010-09-20 12:30
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
得分:0 
p[i]='\0';  //你输入的是字符串当然要以字符串结束符结尾了!这点好理解啊)
 ch1_n=strlen(p1);//
    ch2_n=strlen(p2);//这两处你道是改对了!不用减一,strlen计算字符串长度时是不算字符串结束符的
还有就是这个程序能实现大数相加问题!我也写过一个这个程序!不过没你的算法精妙!楼主恕我才疏学浅!你提的其他的问题我现在还没想通!敬请后面高人指教一二
2010-09-20 21:54
lwlls668
Rank: 2
等 级:论坛游民
帖 子:59
专家分:72
注 册:2010-4-9
得分:0 
o(︶︿︶)o    我郁闷了  怎么没人上来看看呢    帮我指点一下啊····
2010-09-21 14:39



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-320930-1-1.html




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

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