鱼C论坛

 找回密码
 立即注册
查看: 1045|回复: 8

[已解决]两个长整数相加

[复制链接]
发表于 2021-8-6 18:46:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 焦糖橙子 于 2021-8-6 18:55 编辑

程序目标:实现任意长度的整数加法运算。
特殊要求:
1.将数字看成字符进行操作
2.要根据每次输入的长度,通过realloc来申请内存大小

请问我这个代码有什么地方错了?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *get_s(void);
char *add(char *num1,char *num2);

char *add(char *num1,char *num2)//实现两个字符串相加
{
        char*last1=num1;
        char*last2=num2;
        char*result;
        int count1=0,count2=0;
        int mark=0,temp=0,max,digit=0;//mark表示是否需要进位,digit用来表示正在计算的位数
        
        while(*last1++)
        {
                count1++;
        }
        last1-=2;
        while(*last2++)
        {
                count2++;
        }
        last2-=2;
        
        max=count1>count2?count1:count2;
        result=(char*)realloc(result,max*sizeof(char));
        
        
        for(;count1!=0&&count2!=0;count1--,count2--)//将num1与num2相同的位数相加
        {
                if(mark=0)
                {
                        temp=*last1+*last2-'0'-'0';
                        last1--;
                        last2--;
                        
                }
                else
                {
                        temp=*last1+*last2-'0'-'0'+1;
                        last1--;
                        last2--;
                }
                if(temp>9)
                {
                        result[digit]=temp-10;
                        mark=1;
                        digit++;
                }
                else
                {
                        result[digit]=temp;
                        mark=0;
                        digit++;
                }
        }

                if(count1==0)//将剩下的位数赋值到result
        {
                for(;count2!=0;count2--)
                {
                        if(mark=0)
                        {
                                temp=*last2-'0';
                                last2--;
                        
                        }
                        else
                        {
                                temp=*last2-'0'+1;
                                last2--;
                        }
                        if(temp>9)
                        {
                                result[digit]=temp-10;
                                mark=1;
                                digit++;
                        }
                        else
                        {
                                result[digit]=temp;
                                mark=0;
                                digit++;
                        }
                }
        }
        else
        {
                for(;count1!=0;count1--)
                {
                        if(mark=0)
                        {
                                temp=*last1-'0';
                                last1--;
                        }
                        else
                        {
                                temp=*last1-'0'+1;
                                last1--;
                        }
                        if(temp>9)
                        {
                                result[digit]=temp-10;
                                mark=1;
                                digit++;
                        }
                        else
                        {
                                result[digit]=temp;
                                mark=0;
                                digit++;
                        }
                }
        }
        

        return result;
        
}


char *get_s(void)//获取字符串
{
        char ch;
        char*num;
        int count=0;
        if((ch=getchar())!='\n')
        {
                num=(char*)realloc(num,(count+1)*sizeof(char));
                num[count++]=ch;
                get_s();
        }
        return num;
        
}


int main(void)
{
        
        char*num1;
        char*num2;
        char*result;
        
        printf("请输入一个整数:");        
        num1=get_s();
                        
        printf("请输入一个整数:");
        num2=get_s();
        
        result=add(num1,num2);
        
        printf("计算结果是:%s\n", result);
        
        return 0;
}
 
最佳答案
2021-8-6 23:19:17
逻辑不对 + 变量不初始化 + 内存申请了不释放 + 把 == 写成 =
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *get_s(void);
char *add(char *num1,char *num2);

char *add(char *num1,char *num2)//实现两个字符串相加
{
    char*last1=num1;
    char*last2=num2;
    char*result = NULL;
    int count1=0,count2=0;
    int mark=0,temp=0,max,digit=0;//mark表示是否需要进位,digit用来表示正在计算的位数

    while(*last1++)
    {
        count1++;
    }
    last1-=2;
    while(*last2++)
    {
        count2++;
    }
    last2-=2;

    max=count1>count2?count1:count2;
    max += 1;   // 进位
    max += 1;   // '\0'
    result=(char*)realloc(result,max*sizeof(char));
    result[max - 1] = '\0';
    digit = max - 1 - 1;

    for(;count1!=0&&count2!=0;count1--,count2--)
    {
        /*
        //if(mark=0)
        if(mark == 0)
        {
            temp=*last1+*last2-'0'-'0';
            last1--;
            last2--;

        }
        else
        {
            temp=*last1+*last2-'0'-'0'+1;
            last1--;
            last2--;
        }
        */
        temp = (*last1-- - '0') + (*last2-- - '0') + mark;
        mark = 0;
        if(temp > 9) {
            mark = 1;
            temp -= 10;
        }
        result[digit--] = temp + '0';

        /*
        if(temp>9)
        {
            result[digit]=temp-10;
            mark=1;
            digit++;
        }
        else
        {
            result[digit]=temp;
            mark=0;
            digit++;
        }
        */
    }
    char *p = NULL;
    char *pe = NULL;
    if(count1 != 0) p = last1, pe = num1 - 1;
    if(count2 != 0) p = last2, pe = num2 - 1;
    while(p != pe) {
        temp = (*p-- - '0') + mark;
        mark = 0;
        if(temp > 9) {
            mark = 1;
            temp -= 10;
        }
        result[digit--] = temp + '0';
    }
    if(mark) result[digit--] = mark + '0';
    if(digit == 0) { // 之前多申请了一个进位,全部字符串前移一位
        for(size_t i = 0; i < max - 1; ++i) {
            result[i] = result[i + 1];
        }
        result = realloc(result, max - 1);
    }
    return result;
}

char *get_s(void)//获取字符串
{
    char ch;
    //char*num;
    char*num = NULL;
    int count=0;
    if((ch=getchar())!='\n')
    {
        num=(char*)realloc(num, 2);
        num[count++]=ch;
        num[count++]='\0';
    } else {
        num=(char*)realloc(num, 1);
        num[count++]='\0';
        return num;
    }
    char *next = get_s();
    size_t size = strlen(next);
    if(size) {
        num = realloc(num, size + count);
        strcat(num, next);
    }
    free(next);
    return num;
}


int main(void)
{

    char*num1;
    char*num2;
    char*result;

    printf("请输入一个整数:");        
    num1=get_s();

    printf("请输入一个整数:");
    num2=get_s();

    result=add(num1,num2);

    printf("计算结果是:%s\n", result);

    free(result);
    free(num2);
    free(num1);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-6 19:02:06 | 显示全部楼层
好长
 temp=*last1+*last2-'0'-'0';
这减两次啥意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-6 19:25:13 | 显示全部楼层
两个函数全是错的,get_s 函数无法构成递归
add 函数,你能说一说你的实现思路吗?
(add 函数简单的看了看,很有可能是错的)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *get_s(void);
char *add(char *num1,char *num2);

char *add(char *num1,char *num2)//实现两个字符串相加
{
    char*last1=num1;
    char*last2=num2;
    char*result;
    int count1=0,count2=0;
    int mark=0,temp=0,max,digit=0;//mark表示是否需要进位,digit用来表示正在计算的位数

    while(*last1++)
    {
        count1++;
    }
    last1-=2;
    while(*last2++)
    {
        count2++;
    }
    last2-=2;

    max=count1>count2?count1:count2;
    result=(char*)realloc(result,max*sizeof(char));


    for(;count1!=0&&count2!=0;count1--,count2--)
    {
        if(mark=0)
        {
            temp=*last1+*last2-'0'-'0';
            last1--;
            last2--;

        }
        else
        {
            temp=*last1+*last2-'0'-'0'+1;
            last1--;
            last2--;
        }
        if(temp>9)
        {
            result[digit]=temp-10;
            mark=1;
            digit++;
        }
        else
        {
            result[digit]=temp;
            mark=0;
            digit++;
        }
    }
    return result;

}


char *get_s(void)//获取字符串
{
    char ch;
    //char*num;
    char*num = NULL;
    int count=0;
    if((ch=getchar())!='\n')
    {
        num=(char*)realloc(num, 2);
        num[count++]=ch;
        num[count++]='\0';
    } else {
        num=(char*)realloc(num, 1);
        num[count++]='\0';
        return num;
    }
    char *next = get_s();
    size_t size = strlen(next);
    if(size) {
        num = realloc(num, size + count);
        strcat(num, next);
    }
    free(next);
    return num;
}


int main(void)
{

    char*num1;
    char*num2;
    char*result;

    printf("请输入一个整数:");        
    num1=get_s();

    printf("请输入一个整数:");
    num2=get_s();


    printf("%s\n", num1);
    printf("%s\n", num2);

    /*
    result=add(num1,num2);

    printf("计算结果是:%s\n", result);
    */

    //free(result);
    free(num2);
    free(num1);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-6 19:26:49 | 显示全部楼层
申请了内存,就要释放,alloc/free 应该成对出现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-6 23:19:17 | 显示全部楼层    本楼为最佳答案   
逻辑不对 + 变量不初始化 + 内存申请了不释放 + 把 == 写成 =
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *get_s(void);
char *add(char *num1,char *num2);

char *add(char *num1,char *num2)//实现两个字符串相加
{
    char*last1=num1;
    char*last2=num2;
    char*result = NULL;
    int count1=0,count2=0;
    int mark=0,temp=0,max,digit=0;//mark表示是否需要进位,digit用来表示正在计算的位数

    while(*last1++)
    {
        count1++;
    }
    last1-=2;
    while(*last2++)
    {
        count2++;
    }
    last2-=2;

    max=count1>count2?count1:count2;
    max += 1;   // 进位
    max += 1;   // '\0'
    result=(char*)realloc(result,max*sizeof(char));
    result[max - 1] = '\0';
    digit = max - 1 - 1;

    for(;count1!=0&&count2!=0;count1--,count2--)
    {
        /*
        //if(mark=0)
        if(mark == 0)
        {
            temp=*last1+*last2-'0'-'0';
            last1--;
            last2--;

        }
        else
        {
            temp=*last1+*last2-'0'-'0'+1;
            last1--;
            last2--;
        }
        */
        temp = (*last1-- - '0') + (*last2-- - '0') + mark;
        mark = 0;
        if(temp > 9) {
            mark = 1;
            temp -= 10;
        }
        result[digit--] = temp + '0';

        /*
        if(temp>9)
        {
            result[digit]=temp-10;
            mark=1;
            digit++;
        }
        else
        {
            result[digit]=temp;
            mark=0;
            digit++;
        }
        */
    }
    char *p = NULL;
    char *pe = NULL;
    if(count1 != 0) p = last1, pe = num1 - 1;
    if(count2 != 0) p = last2, pe = num2 - 1;
    while(p != pe) {
        temp = (*p-- - '0') + mark;
        mark = 0;
        if(temp > 9) {
            mark = 1;
            temp -= 10;
        }
        result[digit--] = temp + '0';
    }
    if(mark) result[digit--] = mark + '0';
    if(digit == 0) { // 之前多申请了一个进位,全部字符串前移一位
        for(size_t i = 0; i < max - 1; ++i) {
            result[i] = result[i + 1];
        }
        result = realloc(result, max - 1);
    }
    return result;
}

char *get_s(void)//获取字符串
{
    char ch;
    //char*num;
    char*num = NULL;
    int count=0;
    if((ch=getchar())!='\n')
    {
        num=(char*)realloc(num, 2);
        num[count++]=ch;
        num[count++]='\0';
    } else {
        num=(char*)realloc(num, 1);
        num[count++]='\0';
        return num;
    }
    char *next = get_s();
    size_t size = strlen(next);
    if(size) {
        num = realloc(num, size + count);
        strcat(num, next);
    }
    free(next);
    return num;
}


int main(void)
{

    char*num1;
    char*num2;
    char*result;

    printf("请输入一个整数:");        
    num1=get_s();

    printf("请输入一个整数:");
    num2=get_s();

    result=add(num1,num2);

    printf("计算结果是:%s\n", result);

    free(result);
    free(num2);
    free(num1);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-6 23:22:00 | 显示全部楼层
改一下
之前多申请了一个进位,全部字符串前移一位
之前多申请了一个进位,全部字符前移一位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-7 08:39:45 | 显示全部楼层
万千只cnm 发表于 2021-8-6 19:02
好长

这减两次啥意思

因为那个last1和last2都是字符串,都要减去'\0'再相加才是数字相加
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-7 08:51:38 | 显示全部楼层
人造人 发表于 2021-8-6 19:25
两个函数全是错的,get_s 函数无法构成递归
add 函数,你能说一说你的实现思路吗?
(add 函数简单的看了 ...

我想的思路是,先通过get_s函数获取两个字符串数组,然后传递到add里
add:存储的字符串数组个位数在末尾,首先找到个位的地址赋值给last
然后个位相加,若结果>9则mark=1表示需要进位,若<=9则mark=0,表示不需要进位
然后last1--;last2--;再进行十位数的运算,通过mark判断是否需要再加一。
然后以此类推,到最高位,如果num1的位数>num2的位数,则num2已经没有更大的位数
即后续只要把num1中的字符赋值给result 就行了,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-7 09:14:19 | 显示全部楼层
人造人 发表于 2021-8-6 23:19
逻辑不对 + 变量不初始化 + 内存申请了不释放 + 把 == 写成 =

感谢回答,那个进位那里我写的时候确实思路很乱,看了你的感觉清晰多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 22:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表