给出两个用字符串表示的数字,将两个数字的乘积作为字符串返回。
备注:数字可以无限大,且是非负数。
备注:数字可以无限大,且是非负数。
class Solution {
public:
string mul(string num1,int m){//计算一个字符串和一个个位数的乘积
int n=num1.size();
int t=0;
for(int i=n-1;i>=0;i--){
int val=(num1[i]-'0')*m+t;
t=val/10;
num1[i]='0'+val%10;
}
if(t>0)
num1.insert(num1.begin(),'0'+t);
return num1;
}
string add(string num1,string num2){//计算两个字符串的和
if(num1.size()<num2.size()){
string tmp=num1;
num1=num2;
num2=tmp;
}
num2.insert(num2.begin(),num1.size()-num2.size(),'0');
int t=0;
for(int i=num1.size()-1;i>=0;i--){
int val=num1[i]-'0'+num2[i]-'0'+t;
t=val/10;
num1[i]=val%10+'0';
}
if(t>0)
num1.insert(num1.begin(),t+'0');
return num1;
}
string multiply(string num1, string num2) {
if(num1.size()<num2.size()){
string tmp=num1;
num1=num2;
num2=tmp;
}
string res;
for(int i=0;i<num2.size();i++){//类似于sum=sum*10*x
res.insert(res.begin()+res.size(),'0');
res=add(res,mul(num1,num2[i]-'0'));
}
int i=0;
while(i<res.size()&&res[i]=='0')//经过上面的计算后,有可能在字符串的开始位置有0
i++;
if(i>=res.size())//如果结果全是为0
return "0";
else//否则从第一个非0位置开始算起
return res.substr(i);
}
};
class Solution {
public:
string multiply(string num1, string num2) {
int m = num1.length();
int n = num2.length();
int c = 0;
string r(m+n, '0');
for(int i=m-1;i>=0;i--)
{
int a = num1[i]-'0';
for(int j=n-1;j>=0;j--)
{
int b = num2[j]-'0';
int d = r[i+j+1]-'0';
int x = a*b + d + c;
r[i+j+1] = x%10+'0';
c = x/10;
}
if(c)
{
r[i] = c+'0';
c = 0;
}
}
int k = 0;
while(k<r.size() && r[k]=='0')
k++;
return k==r.size()?"0":r.substr(k);
}
}; /**
字符串相乘 - 即 大数相乘, 用模拟乘法累加法
*/
public class StringMultiplication {
/**
*
* @param num1 string字符串
* @param num2 string字符串
* @return string字符串
*/
public String multiply (String num1, String num2) {
int len_num1 = num1.length();
int len_num2 = num2.length();
// 长度为 len_num1 + len_num2 的结果数据,用来存放结算的乘积的值
int[] result = new int[len_num1 + len_num2];
Arrays.fill(result, 0);
/*
先不考虑进位问题,根据竖式的乘法运算,num1的第i位与num2的第j位相乘,结果应该存放在结果的第i+j位上
为了方便,从
*/
for (int i = len_num1 - 1; i >= 0; i--) {
for (int j = len_num2 - 1; j>= 0; j--) {
// 因为 num1 、num2 的高位都是从 0 开始数的,所以存储结果的时候,存在 i + j + 1 的索引下
result[i + j + 1] += (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
}
}
// 单独处理 result 中的进位问题. 从低位 --> 高位 (从 result 的 右 -> 左)
for (int i = result.length - 1; i > 0; i--) {
if (result[i] >= 10) {
result[i -1] += result[i] / 10;
result[i] %= 10;
}
}
// int[] -> String
StringBuffer sb = new StringBuffer();
int i = 0;
while (result[i] == 0 && i < result.length - 1) {
i ++;
}
while (i < result.length) {
sb.append(result[i++]);
}
return sb.toString();
}
public static void main(String[] args) {
String num1 = "0";
String num2 = "0";
System.out.println(new StringMultiplication().multiply(num1, num2));
}
} import java.util.*;
import java.math.*;
public class Solution {
/**
*
* @param num1 string字符串
* @param num2 string字符串
* @return string字符串
*/
public String multiply (String num1, String num2) {
if(num1.equals("0") || num2.equals("0")){
return "0";
}
int size1 = num1.length();
int size2 = num2.length();
int[] result = new int[size1 + size2];
StringBuilder sb = new StringBuilder();
//分别交叉计算两个数字的乘积,并存入数组保存
for(int i = size1 - 1; i >= 0; i--){
for(int j = size2 - 1; j >= 0; j--){
result[i + j + 1] += (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
}
}
//根据进位进行相加
int b = 0;
for(int i = result.length - 1; i >= 0; i--){
//当前乘积加上一组数据的进位
result[i] += b;
//下次的进位值
b = result[i] / 10;
//去掉进位后的值
result[i] = result[i] % 10;
}
//去掉开头的0
int index = 0;
for(int i = 0; i < result.length; i++){
if(result[i] != 0){
index = i;
break;
}
}
//拼接成字符串
for(int i = index; i < result.length; i++){
sb.append(result[i] + "");
}
return sb.toString();
}
} //来一个纯模拟手工运算的方法。
//先列出梯形的乘法步骤
//再对应相加,然后进位。
//从高位往低位找第一个不为0个数字,因为临时数组初始化的时候都是0.
//最后将这些数字转化为字符串。
//4ms AC,看来也不慢。
class Solution {
public:
string multiply(string num1, string num2) {
if(num1 == "0" || num2 == "0")
return "0";
vector<int> arr(num1.size() + num2.size() , 0);
string ans = "";
char tmp = '0';
for (int i = num1.size() - 1; i >= 0; --i)
for (int j = num2.size() - 1; j >= 0; --j) {
arr[i + j + 1] += (num1[i] - '0')*(num2[j] - '0');
}
for(int i = arr.size()-1; i > 0 ; --i){
arr[i-1] += arr[i] / 10;
arr[i] = arr[i] % 10;
}
int i = 0;
while(arr[i] == 0) ++i;
while(i != arr.size()){
tmp = arr[i] + '0';
ans += tmp;
++i;
}
return ans;
}
};
class Solution {
public:
string multiply(string num1, string num2) {
vector<int> v(num1.length()+num2.length(),0);
for(int i=0;i<num1.length();i++){
for(int j=0;j<num2.length();j++){
v[i+j]+=(num1[i]-'0')*(num2[j]-'0');
}
}
int carry=0;
for(int j=v.size()-1;j>=1;j--){
v[j]=(carry+v[j-1])%10;
carry=(carry+v[j-1])/10;
}
if (carry != 0)
v[0] = carry;
else
v[0] = -1;
string s="";
for(auto i:v){
if(i>=0)
s+=i+'0';
}
if (s[0] == '0')
s = "0";
return s;
}
}; /** * 43. Multiply Strings * @author Jacob * */ public class Demo1 { /* * 大数相乘 * Runtime: 21 ms.Your runtime beats 99.95 % of java submissions. * 用空间换时间:如果有空间要求的话,可以不建立arr1和arr2数组,直接在计算的时间用num1.charAt(i)-'0'即可 */ public String multiply(String num1, String num2) { if (num1 == null || num2 == null || num1.length() == 0 || num2.length() == 0) return null; if(num1.equals("0")||num2.equals("0")) return "0"; int len1 = num1.length(), len2 = num2.length(); int[] arr1 = new int[len1], arr2 = new int[len2]; // 首尾交换,便于计算 for (int i = 0; i < len1; i++) { arr1[len1 - 1 - i] = num1.charAt(i) - '0'; } for (int i = 0; i < len2; i++) { arr2[len2 - 1 - i] = num2.charAt(i) - '0'; } // 两数相乘结果的长度介于len1*len2-1到len1*len2 int[] res = new int[len1 + len2]; for (int i = 0; i < len1; i++) { for (int j = 0; j < len2; j++) { res[i + j] += arr1[i] * arr2[j]; } } for (int i = 0; i < len1 + len2; i++) { while (res[i] >9) { res[i + 1] += res[i] / 10; res[i] = res[i] % 10; } } StringBuilder ans=new StringBuilder(); for (int i = len1 + len2-1; i >=0; i--) { ans.append(res[i]); } //如果第一个元素是0,去除 return ans.charAt(0) == '0' && ans.length() != 1 ? ans.substring(1) : ans.toString(); } }package go.jacob.day721;
public String multiply(String num1, String num2) {
int n1 = num1.length();
int n2 = num2.length();
StringBuilder sb = new StringBuilder();
int[] tmp = new int[n1+n2];
for(int i=n1-1;i>=0;i--){
for(int j=n2-1;j>=0;j--){
tmp[i+j+1] +=(num1.charAt(i)-'0')*(num2.charAt(j)-'0');
}
}
int carrybit=0;//从个位开始,carrybit是进位
for(int i=tmp.length-1;i>=0;i--){
tmp[i]+=carrybit;
carrybit=tmp[i]/10;
tmp[i]=tmp[i]%10;
}
int left=0;
while(left<tmp.length-1&&tmp[left]==0)
left++;
for(;left<tmp.length;left++){
sb.append(tmp[left]);
}
return sb.toString();
}
class Solution {
public:
string multiply(string num1, string num2) {
int carry = 0;
string result(num1.size()+num2.size(),'0');
for (int i=num1.size()-1;i>=0;--i) {
int a = num1[i] - '0';
for (int j=num2.size()-1;j>=0;--j) {
int b = num2[j] - '0';
int c = result[i+j+1] - '0';
int v = a*b+c+carry;
result[i+j+1] = v%10 + '0';
carry = v/10;
}
if(carry){
result[i] = carry+'0';
carry = 0;
}
}
int i = 0;
while (i<result.size()&&result[i]=='0') ++i;
return i==result.size()?"0":result.substr(i);
}
};
基本思路:
代码如下:
//
// Created by jt on 2020/9/29.
//
#include <string>
using namespace std;
class Solution {
public:
/**
*
* @param num1 string字符串
* @param num2 string字符串
* @return string字符串
*/
string multiply(string num1, string num2) {
// write code here
string res = string(num1.size() + num2.size(), '0');
int idx = num1.size()+num2.size()-1;
for (int i = num2.size()-1; i >= 0; --i) {
// offset保存res当前元素离末尾元素的偏移量,carry保存进位
int offset, carry = 0, digit = num2[i] - '0';
for (int j = num1.size()-1; j >= 0; --j) {
offset = (num1.size()-1-j)+(num2.size()-1-i);
int a = digit * (num1[j]-'0') + carry + res[idx-offset]-'0';
res[idx-offset] = a % 10 + '0';
carry = a / 10;
}
if (carry != 0) res[idx-offset-1] = carry + '0';
}
int begin = 0;
while(begin < res.size() && res[begin] == '0') ++begin;
if (begin == res.size()) return "0";
else return res.substr(begin);
}
};
public class Solution {
public String multiply(String num1, String num2) {
if(num1.equals("0")||num2.equals("0"))
return "0";
if(num1.length()<num2.length()){
String temp=num1;
num1=num2;
num2=temp;
}
String[] s=new String[num2.length()];
for(int i=0;i<s.length;i++){
s[i]="";
}
String res="";
for(int i=num2.length()-1;i>=0;i--){
int index=0;
int n2=Integer.valueOf(String.valueOf(num2.charAt(i)));
for(int j=num1.length()-1;j>=0||index!=0;j--){
if(j>=0){
int n1=Integer.valueOf(String.valueOf(num1.charAt(j)));
int sum=n1*n2+index;
index=sum/10;
int y=sum%10;
s[num2.length()-1-i]=String.valueOf(y)+s[num2.length()-1-i];
}
else{
s[num2.length()-1-i]=String.valueOf(index)+s[num2.length()-1-i];
index=0;
}
}
}
for(int i=0;i<s.length;i++){
for(int j=i;j>0;j--){
s[i]=s[i]+"0";
}
}
int index=0;
for(int i=0;i<num1.length()+num2.length();i++){
int sum=0;
sum=sum+index;
for(int j=0;j<s.length;j++){
if(s[j].length()-i-1>=0){
sum=sum+Integer.valueOf(String.valueOf(s[j].charAt(s[j].length()-i-1)));
}
}
index=sum/10;
res=String.valueOf(sum%10)+res;
}
int i=0;
while(i<res.length()&&res.charAt(i)=='0'){
i++;
}
return res.substring(i);
}
} class Solution {
public:
string multiply(string num1, string num2) {
int n1 = num1.length();
int n2 = num2.length();
vector<int> temp(n1 + n2, 0);
for (int i = n1 - 1;i >= 0;i--) {
for (int j = n2 - 1;j >= 0;j--) {
temp[i + j + 1] += (num1[i] - '0') * (num2[j] - '0');
}
}
int carry = 0;
for (int index = temp.size() - 1;index >= 0;index--) {
temp[index] = temp[index] + carry;
carry = temp[index] / 10;
temp[index] = temp[index] % 10;
}
int left = 0;
while (left < temp.size() && temp[left] == 0) {
left++;
}
string res;
for (;left < temp.size();left++) {
res.append(1, temp[left] + '0');
}
return res.length() != 0 ? res : "0";
}
}; string multiply(string num1, string num2) {
if(num1=="0"||num2=="0")
return "0";
int n1=num1.length(),n2=num2.length();
vector<vector<int>> multiply(n2,vector<int>(n1+n2-1));
for(int i=0;i<n1;i++)
for(int j=0;j<n2;j++){
multiply[j][j+i]=(num1[n1-i-1]-'0')*(num2[n2-j-1]-'0');
}
string res="";
int pre=0;
for(int i=0;i<n1+n2-1;i++){
int num=pre;
for(int j=0;j<n2;j++){
num+=multiply[j][i];
}
res.push_back('0'+num%10);
pre=num/10;
}
while(pre!=0){
res.push_back('0'+pre%10);
pre/=10;
}
reverse(res.begin(),res.end());
return res;
}
public class MultiplyStrings {
public String multiply(String num1, String num2) {
int m=num1.length(),n=num2.length();
int[] pos= new int[m+n];
for(int i=m-1;i>=0;i--){
for(int j=n-1;j>=0;j--){
int mul=(num1.charAt(i)-'0')*(num2.charAt(j)-'0');
int p1=i+j,p2=i+j+1;
int sum=mul+pos[p2];
pos[p1]+=sum/10;
pos[p2]=(sum)%10;
}
}
StringBuilder sb=new StringBuilder();
for(int p:pos){
if(!(sb.length() == 0 && p == 0)){
sb.append(p);
}
}
return sb.length()==0?"0":sb.toString();
}
}
raodanwoyiranxihuanni class Solution {
public:
string multiply(string num1, string num2) {
int len1 = num1.size();
int len2 = num2.size();
if (len1 == 0 || len2 == 0 || num1 == "0" || num2 == "0") return "0";
vector<int > temp(len1 + len2 + 1, 0);
for (int i = 0; i < len1; ++i)
{
for (int j = 0; j < len2; ++j)
{
temp[i + j + 2] += (num1[i] - '0') * (num2[j] - '0');
}
}
int c = 0;//进位
for (int i = temp.size() - 1; i >= 0; i--)
{
int num = temp[i] + c;
temp[i] = num % 10;
c = num / 10;
}
int nozeroindex = 0;
for (; nozeroindex < temp.size(); ++nozeroindex)
{
if (temp[nozeroindex] != 0)
break;
}
string res;
for (int i = nozeroindex; i < temp.size(); ++i)
{
res += char(temp[i] + '0');
}
return res;
}
};
//一言不合就超时……
class Solution {
public:
string mul(string s,int l,int m)
{
int cari=0;
for(int i=l-1;i>=0;i--)
{
int tp=(s[i]-'0')*m+cari;
cari=tp/10;
s[i]='0'+tp%10;
}
if(cari>0)
s=char(cari+'0')+s;
return s;
}
string addi(string s1,string s2,int l)
{
int l2 = s2.length();
for (int i = 0; i < l - l2; i++)
s2 = '0' + s2;
string cari="";
string ad="";
bool co=false;
for(int i=0;i<l;i++)
{
int tp=s1[i]-'0'+s2[i]-'0';
if(tp>=10)
co=true;
ad+=tp%10+'0';
cari+=tp/10+'0';
}
if(!co)
return ad;
ad='0'+ad;
cari+='0';
return addi(ad,cari,l+1);
}
string core(string s1,string s2,int l1,int l2)
{
string out="";
for(int i=0;i<l2;i++)
{
int m=s2[i]-'0';
string tp=mul(s1,l1,m);
if(out.empty())
out=tp;
else
{
out+='0';
out=addi(out,tp,out.length());
}
}
int j=0;
while(j<out.length()&&out[j]=='0')
j++;
return out.substr(j);
}
string multiply(string num1, string num2) {
int l1=num1.length();
int l2=num2.length();
if (l1 == 0 || l2 == 0)
return "";
if (num1 == "0" || num2 == "0")
return "0";
if (num1 == "1")
return num2;
if (num2 == "1")
return num1;
if(l1>l2)
return core(num1,num2,l1,l2);
return core(num2,num1,l2,l1);
}
};
public static String multiply(String num1, String num2) {
int[][] result = new int[Math.max(num1.length(), num2.length())][(num1.length() + num2.length()) + 1];
int sign = 0, index1 = 0, index2 = result[0].length - 1;
int[] multiplyResult = new int[num1.length() + num2.length() + 1];
int index = multiplyResult.length - 1;
for (int i = num1.length() - 1; i >= 0; i--) {
int a = num1.charAt(i) - '0';
for (int j = num2.length() - 1; j >= 0; j--) {
int b = num2.charAt(j) - '0';
result[index1][index2] = (a * b + sign) % 10;
sign = (a * b + sign) / 10;
index2--;
}
if (index2 >= 0 && sign != 0) {
result[index1][index2] = sign;
}
index1++;
index2 = result[0].length - index1 - 1;
sign = 0;
}
sign = 0;
//相加
for (int i = result[0].length - 1; i >= 0; i--) {
int sum = 0;
for (int j = 0; j < result.length; j++) {
sum += result[j][i];
}
int a = (sum + sign) % 10;
sign = (sum + sign) / 10;
multiplyResult[index] = a;
index--;
}
//算上符号位
if (sign > 0) {
multiplyResult[index] = sign;
}
StringBuilder sb = new StringBuilder();
//补偿最后index--;
index++;
while (index >= 0 && multiplyResult[index] == 0) {
index++;
//如果所有的都为0
if (index == multiplyResult.length)
return "0";
}
//得到结果
for (int i = index; i < multiplyResult.length; i++) {
sb.append(multiplyResult[i]);
}
return sb.toString();
}