字符串相乘
给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。
一开始看到这个题目,当然首先想到的是小学就学的进制乘法,那种方法要记录进位和计算当前位的结果,实现起来比较简单。
例子:
1 2 3
4 5 6
--------------是不是很熟悉。
和我们的习惯每次计算下面一个位数乘上面的数的时候就做一次加法运算,而不是全部乘起来再做 加法运算。
class Solution { public: string multiply(string num1, string num2) { /*****蛮力法--O(n^2)****/ int len1 = num1.length(); int len2 = num2.length(); if((len1==1&&num1[0]=='0')||(len2==1&&num2[0]=='0')) return "0"; char *res = new char[len1+len2+10]; memset(res,0,sizeof(char)*(len1+len2+10)); int pos=0;//记录第几位 int value=0;//记录进位数 for(int i=len1-1;i>=0;i--){ pos=len1-i-1; value=0; for(int j=len2-1;j>=0;j--){ if(res[pos]>='0') res[pos]-='0';//便于计算 int val = (num1[i]-'0')*(num2[j]-'0');//获得乘积 int val1 = value+val%10+res[pos];//获得位上累加数 //cout<<num1[i]<<"--"<<num2[j]<<"---"<<val<<"--"<<val1<<endl; if(val1/10==0){//相加无进位 value = val/10;//获得进位 res[pos++] = val1+'0';//获得位上结果 } else{ value = val/10+val1/10;//获得进位 res[pos++] = val1%10+'0';//获得位上结果 } } if(value!=0){ if(res[pos]>='0') res[pos]-='0'; res[pos]=value+'0';//最后的进位 } } string str = res; reverse(str.begin(),str.end()); return str; } };
值得记录的是,在这个题目中将字符串数组化为string类型,一开始遗忘了,查询后发现可以直接利用string类型的构造函数传入char数组做参数或是拷贝构造直接利用复制号实现。
然后利用了algorithm头文件中的reverse函数将string类型翻转。
字符串相乘
给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。