LeetCode_43. 字符串相乘(c语言)

char * addStrings(char * num1, char * num2){
    //从两个数字最后一位开始相加, add是表示进位
    int i = strlen(num1) - 1, j = strlen(num2) - 1, add = 0;
    //定义char指针并分配空间,fmax是c语言库函数
    char* ans = (char*)malloc(sizeof(char) * (i + j + 5));
    int anslen = 0;
    //计算
    while(i >= 0 || j >= 0 || add != 0){
        /*你可能会想两个数字位数不同怎么处理,
        这里我们统一在指针当前下标处于负数的时候返回 0,
        等价于对位数较短的数字进行了补零操作。*/
        int x = i >= 0 ? num1[i] - '0' : 0;
        int y = j >= 0 ? num2[j] - '0' : 0;
        //x, y 和进位相加
        int result = x + y + add;
        ans[anslen++] = '0' + result % 10;
        //进位数字
        add = result / 10;
        //从低到高依次相加
        i--, j--;
    }
    //计算结果翻转过来
    for (int i = 0; 2 * i < anslen; i++){
        char t = ans[i];
        ans[i] = ans[anslen - i - 1], ans[anslen - i - 1] = t;
    }
    ans[anslen++] = 0;
    return ans;
}

char * multiply(char * num1, char * num2){
    //分别长度
    int m = strlen(num1), n = strlen(num2);
    char* ans = malloc(sizeof(char) * 2);
    ans[0] = '0', ans[1] = 0;
    //num1为0或者num2为0之后返回0
    if ((m == 1 && num1[0] == '0') || (n == 1 && num2[0] == '0')) {
        return ans;
    }
    //循环
    for(int i = n - 1; i >= 0; i--){
        //num1长度+num2长度+5
        char* curr = malloc(sizeof(char) * (n + m + 5));
        int currlen = 0;
        int add = 0;
        //curr数组初始化
        for (int j = n - 1; j > i; j --){
            curr[currlen++] = 0;
        }
        int y = num2[i] - '0';
        
        for(int j = m - 1; j >= 0; j--){
            int x = num1[j] - '0';
            //计算,先乘积,在求和
            int product = x * y + add;
            curr[currlen++] = product % 10;
            //进位
            add = product / 10;
        }
        //判断进位
        while(add != 0){
            curr[currlen++] = add % 10;
            add /= 10;
        }
        //高低位交换
        for (int i = 0; 2 * i < currlen; i++){
            char t = curr[i];
            curr[i] = curr[currlen - 1 - i];
            curr[currlen - 1 - i] = t;
        }
        //需要注意的是,num2\textit{num}_2num2​ 除了最低位以外,其余的每一位的运算结果都需要补 000。
        for(int i = 0; i < currlen; i++){
            curr[i] += '0';
        }
        curr[currlen++] = 0;
        //最后相加
        char* tmp = addStrings(ans, curr);
        free(ans), free(curr);
        ans = tmp;
    }
    return ans;

}

运行时间
在这里插入图片描述

好像拿C语言写的好像很少啊,我看题解拿Python写的比较多

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值