题目
给定两个以字符串形式表示的非负整数 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
leetcode大佬写的代码:
我把大佬代码单独复制出来,加了注释,如下:
char * multiply(char * num1, char * num2)
{
int len1 = strlen(num1);
int len2 = strlen(num2);
int totalLength = len1 + len2;
int charIndex = 0;
int valueIndex = 0;
int *value = (int *)malloc(sizeof(int) * totalLength);
//这里result必须动态申请内存,如果定义数组,返回的时候会被操作系统释放,或者用来干其他,导致打印null
char *result = (char *)malloc(sizeof(char) * (totalLength + 1));
//用于让value存放的全是0
memset(value, 0, sizeof(int) * totalLength);
for (int i = len1 - 1; i >= 0; i--){
for (int j = len2 - 1; j >= 0; j--) {
//小学算两位数乘法的时候,用的方法,找出每次相乘的规律,相乘运算结果放在第I+j-1,这是在不超过10的情况下,超过了会给上一位均
value[i + j + 1] += (num1[i] - '0') * (num2[j] - '0');
}
}
for (int i = totalLength - 1; i >0; i--) {
//本位的值就是value[i] %= 10,进位是向i-1进位的
value[i - 1] += value[i] / 10;
value[i] %= 10;
}
while(valueIndex < totalLength - 1 && value[valueIndex] == 0) {
//算出刚开始几位是0的情况,把其去掉
valueIndex++;
}
while(valueIndex < totalLength) {
//整数+'0'可以变成字符串
result[charIndex++] = value[valueIndex++] + '0';
}
result[charIndex] = '\0';
return result;
}
作者:moya
链接:https://leetcode-cn.com/problems/multiply-strings/solution/cyu-yan-by-moya-8/
来源:力扣(LeetCode)
总结:
我自己写的报错把心态报崩了,但我知道了再函数中需要返回一个字符串时候,用动态内存去申请,这样就不会导致被操作系统自动释放,还有我自己做的是先把num1 num2转换成整数,然后相乘,但是没考虑到这样乘的结果会非常大,导致超过范围.因为这里的字符可以有109位,还是竖式相乘法管用.
我写的没通过的代码,因为这样做没考虑到字符串非常长的情况
#include<stdio.h>
#include<string.h>
char * multiply(char * num1, char * num2);
int main(void){
char *num1="3";
char *num2="4";
char *a;
a=multiply(num1,num2);
printf("%s",a);
}
char * multiply(char * num1, char * num2){
int num1len = strlen(num1);
int num2len = strlen(num2);
int total=0;
char *str = (char *)malloc(sizeof(char)*(num1len+num2len+1));
//static char str[201]; 这样可以.但是这里[] 内容必须填写常量.
//char str[num1len+num2len+1] 错误的做法
int count=0;
int n1 = 0;
int n2 = 0;
int b;
int i,j,c;
if(num1[0]=='0' || num2[0]=='0')
return "0";
// num1转换成整数
for(i=0;i<num1len;i++){
c=num1[i]-'0';
n1=10*n1+c;
}
// num2转换成整数
for(i=0;i<num2len;i++){
c=num2[i]-'0';
n2=10*n2+c;
}
//相乘的结果
total=n1*n2;
// 开始转换成字符串
while(total!=0){
str[count]='0'+(total%10);
total=total/10;
count++;
}
str[count]='\0';
if(count==1)
return str;
// 交换位置,因为2*7 程序会输出41
for(j = 0; j <(count/2); j++ )
{
b = str[j];
str[j] = str[count - 1 - j];
str[count - 1 - j] = b;
}
return str;
}