标题:大数加法出问题了
取消只看楼主
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
结帖率:96.43%
已结贴  问题点数:20 回复次数:4 
大数加法出问题了
程序代码:
char *add(char *a, char *b)
{
    char temp[STR_LEN];
    size_t len_a, len_b, len_result;
    int carry1 = 0, carry2 = 0;
    unsigned i, j;

    if (strlen(a) < strlen(b))
    {
        strcpy(temp, a);
        strcpy(a, b);
        strcpy(b, temp);
    }

    len_a = strlen(a);
    len_b = strlen(b);
    char *result = (char *)malloc(sizeof(char) * (len_a + 1));

    for (i = len_a - 1; i >= 0; i--)
    {
        carry1 = carry2;
        carry2 = (a[i] + (i - len_a + len_b >= 0 ? b[i - len_a + len_b] : '0') - 2 * '0' + carry1) / 10;
        result[i + 1] = (a[i] + (i - len_a + len_b >= 0 ? b[i - len_a + len_b] : '0') - 2 * '0' + carry1) % 10 + '0';//这里有问题
    }
    result[0] = carry1;
    result[len_a] = '\0';

    //去掉最前面无意义的0
    for (i = 0; result[i] == '0'; i++);
    for (j = 0; result[i]; i++, j++)
        result[j] = result[i];
    if (j == 0)
        result[j++] = '0';
    result[j] = '\0';

    return result;
}

调试的时候发现的问题:

但是我申请的空间够啊,这个提示是什么意思?
搜索更多相关主题的帖子: 大数 char result strlen for 
2018-12-20 23:07
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
得分:0 
之前用的二维数组做的大数加减,比较简单,但是做乘法的时候卡住了。就想着用字符串处理,结果连加减都不会了...
2018-12-20 23:10
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
得分:0 
我又写了一个,这个经过测试,没有发现问题,但是我依然不知道之前那个该怎么修改
程序代码:
char *add(const char *a, const char *b)
{
    size_t len_a = strlen(a), len_b = strlen(b), len_result = len_a > len_b ? len_a + 1 : len_b + 1;
    unsigned i, j;
    unsigned m, n;
    unsigned carry1 = 0, carry2 = 0;
    unsigned k_i = 1, k_j = 1;//k_i或k_j为0说明a或b已经读完

    char *result = (char *)malloc(sizeof(char) * (len_result + 1));

    i = len_a - 1;
    j = len_b - 1;
    result[len_result] = '\0';
    do
    {
        m = k_i ? a[i] : '0';
        n = k_j ? b[j] : '0';
        carry1 = carry2;
        carry2 = (m + n - 2 * '0' + carry1) / 10;
        result[len_a > len_b ? i + 1 : j + 1] = (m + n - 2 * '0' + carry1) % 10 + '0';
        i ? i-- : (k_i = 0);
        j ? j-- : (k_j = 0);
    } while (k_i || k_j);//直到两个数都读完结束循环
    result[0] = carry2 + '0';

    for (i = 0; result[i] == '0'; i++);
    if (i)
        for (j = 0; result[i - 1]; i++, j++)
            result[j] = result[i];

    return result;
}



[此贴子已经被作者于2018-12-21 17:39编辑过]

2018-12-21 16:16
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
得分:0 
回复 4楼 豆豆的滴
你说这话让我突然想起一个问题:自己的程序别人看起来费劲是因为风格有问题吗?时间一长,我看自己的代码都有点晕...,怎么解决这个问题,总不能疯狂注释吧
2018-12-21 17:36
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
得分:0 
回复 6楼 豆豆的滴
怎么样算是标准的
2018-12-21 22:17



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




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

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