题目描述
给定两个以字符串形式表示的非负整数 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;
}