leetcode 43. 字符串相乘 (字符串+模拟)

43. 字符串相乘

题目

在这里插入图片描述

题解(带注释)

char* addStrings(char* num1, char* num2) {//0 13404 
    int i = strlen(num1) - 1, j = strlen(num2) - 1, add = 0;
    char* ans = malloc(sizeof(char) * (i + j + 5));
    int ansLen = 0;
    while (i >= 0 || j >= 0 || add != 0) {//i对应num1尾部数字,j对应num2尾部数字,add是进位 
        int x = i >= 0 ? num1[i] - '0' : 0;//到头了就赋0 
        int y = j >= 0 ? num2[j] - '0' : 0;
        int result = x + y + add;
        ans[ansLen++] = result % 10;
        add = result / 10;
        i--;
        j--;
    }
    for (int i = 0; i < ansLen / 2; i++) {//正序 
        char t = ans[i];
        ans[i] = ans[ansLen - 1 - i];
        ans[ansLen - 1 - i] = t;
    }
    for (int i = 0; i < ansLen; i++) {//转换为字符 
        ans[i] += '0';
    }
    ans[ansLen++] = 0;//加终结符 
    return ans;
}

char* multiply(char* num1, char* num2) {
    int m = strlen(num1), n = strlen(num2);//strlen 长度 
    char* ans = malloc(sizeof(char) * 2);//临时变量 
    ans[0] = '0', ans[1] = 0;//赋0 
    if ((m == 1 && num1[0] == '0') || (n == 1 && num2[0] == '0')) {//单独判断0的情况 
        return ans;
    }
    for (int i = n - 1; i >= 0; i--) {
        char* curr = malloc(sizeof(char) * (n + m + 5));//n+m保证两数相乘不超范围,其实n+m就可以 
        int currLen = 0;//当前长度 
        int add = 0; //进位 
        for (int j = n - 1; j > i; j--) {//被乘数除个位外,都要补上对应数量的0,放在开头,反转后就扩大了对应的倍数 
            curr[currLen++] = 0;
        }
        int y = num2[i] - '0';//提取第i位数字 
        for (int j = m - 1; j >= 0; j--) {//将num1的每一位与num2[i]相乘 
            int x = num1[j] - '0';
            int product = x * y + add;
            curr[currLen++] = product % 10;
            add = product / 10;
        }
        while (add != 0) {//最高位仍有进位,就将进位放入curr中 
            curr[currLen++] = add % 10;
            add /= 10;
        }
        for (int i = 0; i < currLen / 2; i++) {//交换,将排列方式改为正序 
            char t = curr[i];
            curr[i] = curr[currLen - 1 - i];
            curr[currLen - 1 - i] = t;
        }
        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;
	printf("%s",ans);
}

说明

这次我用的是c语言,其实真的没有c++方便,但有的学校的机试要求只能用c语言,所以被迫拾起了曾经的老友

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值