学渣带你刷Leetcode0043字符串相乘

题目描述

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"
示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"
说明:

num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

白话题目:

非负整数存入字符串中,成绩结果用字符串输出,不让使用字符转整数。

算法:

(1)99*99=9801,也就是4位,

(2)乘法的上面动和下面动都可以的。我们尽量不开车

(3)

详细解释关注 B站  【C语言全代码】学渣带你刷Leetcode 不走丢 https://www.bilibili.com/video/BV1C7411y7gB

C语言完全代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *multiply(char *num1, char *num2)
{
    int i, j;
    int len1 = strlen(num1);
    int len2 = strlen(num2);
    int *temp = (int *)calloc((len1 + len2), sizeof(int));
    char *ret = (char *)calloc((len1 + len2 + 1), sizeof(char));

// 算出错位相乘的乘积每个元素的数字
    for (i = len1 - 1; i >= 0; i--)
    {
        for (j = len2 - 1; j >= 0; j--)
        {
            temp[i + j + 1] += (int)(num1[i] - '0') * (num2[j] - '0');
        }
    }

// 从数组的尾部开始遍历,将第i位的高位通过/累加到第i-1位,然后通过%求余获得当前位的数字。
    for (i = len1 + len2 - 1; i > 0; i--)
    {
        temp[i - 1] += temp[i] / 10;
        temp[i] %= 10;
    }

// 转换成字符串
    ret[0] = '0';  // 初始化默认第一个字符是0,防止输入有一个是'0'
    for (i = 0, j = 0; i < len1 + len2; i++)
    {
        // 排除起始开始的'0'直到第一个非0出现
        if ((j == 0) && (temp[i] == 0))
        {
            continue;
        }
        ret[j++] = (char)(temp[i]) + '0';
    }
    ret[j]='\0';
    return ret;
}


int main()
{
    printf("输入数字串1\n");
    char  *num1;
    num1=(char *)malloc(sizeof(char));
    gets(num1);

    printf("输入数字串2\n");
    char  *num2;
    num2=(char *)malloc(sizeof(char));

    gets(num2);

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

    char *result=multiply(num1, num2);
    printf("%s",result);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值