字符串 leetcode 43 字符串相乘

题目

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

猜你喜欢

转载自blog.csdn.net/mogbox/article/details/112982345
今日推荐