首页 > 试题广场 >

字符串相乘

[编程题]字符串相乘
  • 热度指数:5301 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定两个数字(0-9)字符串(长度不限)求它们的乘积。

输入描述:
第一行为第一个数字字符串

第二行为第二个数字字符串


输出描述:
乘积字符串
示例1

输入

123
20

输出

2460
print (int(input())*int(input()))
python不需要解释
发表于 2019-02-23 12:53:12 回复(13)
import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        BigInteger bi1 = new BigInteger(scanner.next());
        BigInteger bi2 = new BigInteger(scanner.next());
        System.out.println(bi1.multiply(bi2));
    }
}
发表于 2019-07-08 11:13:43 回复(0)
恕我直言,取巧做题的基本丧失了做题目的意义。对于每一道题目,我们要尽可能主动收获一些东西。下面mul代码模拟了乘法的整个过程,只要数字num2不超出内存,就完全行得通。
def mul(num1,num2):
    temp = [i*num1 for i in num2]
    res = ''
    i = 1
    number = temp[0]
    while i <len(temp):
        res += str(number%10)
        number //= 10
        number += temp[i]
        i += 1
    res += str(number)[::-1]
    return res[::-1]
if __name__=='__main__':
    num1 = int(input())
    str2 = [int(i) for i in input()][::-1]
    print(mul(num1,str2))


编辑于 2019-07-25 21:19:48 回复(0)

一行

print(int(input()) * int(input()))
发表于 2019-07-20 07:58:15 回复(0)
刚入门c++的时候写的一个大整数相乘,发现这道题可以用,所以就搞上了,当时候都是用string实现的,这样保证很大的数都有结果,当时还要求不能用转型,就自己写了。
代码有点low,不喜勿喷。
#include <stdio.h>
#include <iostream>
#include <string>

using namespace std;

//字符串转整型
int str_to_int(string a)
{
	int int_num;
	int_num=a[0]-'0';
	return int_num;
}

//整型转string
string int_to_str(int a)
{
	string str_num;
	str_num=a+48;
	return str_num;
}


//大整数相乘
string multi(string num1,string num2)
{
	string result;
	int res=0,res_carry=0,size=0;
	int num1_size=num1.size();
	int num2_size=num2.size();

	//相乘之后最长为size
	size=num1_size+num2_size;
	for(int j=num2_size-1,count=1;j>=0;j--,count++)
	{
		if(count>=2) result.insert((count-1)*size+0,count-1,'0');

		for(int i=num1_size-1;i>=0;i--)
		{
			int med_num1,med_num2;
			string result_num;
			//转化每位的数字为整型
			med_num1=str_to_int(&num1[i]);
			med_num2=str_to_int(&num2[j]);

			//计算相乘结果,包括进位
			res=med_num1*med_num2+res_carry;
			if(res>9) {
				res_carry=res/10;  //进位数
				res = res%10;          //保留低位
				result_num = int_to_str(res);
				result.append(result_num);
			}
			else {
				res_carry=0;    //进位数为0
				result_num = int_to_str(res);
				result.append(result_num);
			}
		}
		if(res_carry!=0) {
			string final_carry=int_to_str(res_carry);
			result.append(final_carry);
			res_carry=0;//清空进位,进行下一位的乘法
		}
		//每次运算之后size大小对齐
		while(result.size()<(count*size)) result.append("0");
	}
			
		//进行加法运算
	string str_sum,final_result;
	int sum=0,sum_carry=0;
	int med_sum=0;
	for(int p=0;p<size;p++)
	{
		for(int count1=0;count1<num2_size;count1++) {
            med_sum =str_to_int(&result[p+(count1*size)]);
            sum = sum + med_sum;
        }
		sum = sum+sum_carry;
		if(sum>9) {
            sum_carry=sum/10;  //进位数
            sum = sum%10;          //保留低位
            str_sum = int_to_str(sum);
            final_result.append(str_sum);
            sum=0;
        }
		else {
            sum_carry=0;    //进位数为0
            str_sum = int_to_str(sum);
            final_result.append(str_sum);
            sum=0;
        }
	}
	if(sum_carry!=0) {
			string final_sum_carry=int_to_str(sum_carry);
			final_result.replace(size,1,final_sum_carry);
			//final_result.append(final_sum_carry);
    }
	return final_result;
}

int main() 
{ 
	string num1,num2,result;
	cin>>num1>>num2;
	result = multi(num1,num2);
	while(result[result.size()-1]=='0') result.erase(result.size()-1);
    for(int i=result.size()-1;i>=0;i--) cout<<result[i];
}

发表于 2019-08-10 23:29:54 回复(0)
importjava.util.*;
importjava.math.BigInteger;
publicclassMain{
    publicstaticvoidmain(String[] argas){
        Scanner sc = newScanner(System.in);
        String n1 = sc.nextLine();
        String n2 = sc.nextLine();
        BigInteger c = newBigInteger(n1);
        BigInteger d = newBigInteger(n2);
         
        BigInteger e = c.multiply(d);
        System.out.println(e);
    }
}
发表于 2019-02-25 13:46:45 回复(1)
//使用大数加法和大数乘法,模拟真实的乘法计算
#include<iostream>
(720)#include<string>

using namespace std;

//大数加法
string BigIntAdd(string s1,string s2){
    int i = s1.size() - 1;
    int j = s2.size() - 1;
    char temp;
    int carry = 0;
    string str = "";
    while(i>=0 && j>=0){
        int num = s1[i] - '0' + s2[j] - '0' + carry;
        carry = num/10;
        num %= 10;
        temp = num + '0';
        str  = temp + str;
        i--;
        j--;
    }
    while(i>=0){
        int num = s1[i] - '0' + carry;
        carry = num/10;
        num %= 10;
        temp = num + '0';
        str = temp + str;
        i--;
    }
    while(j>=0){
        int num = s2[j] - '0' + carry;
        carry = num/10;
        num %= 10;
        temp = num + '0';
        str = temp + str;
        j--;
    }
    if(carry == 1) str = '1' + str;
    return str;
}

//大数乘法
string BigIntMul(string s1,int d){
    int i = s1.size() - 1;
    int carry = 0;
    char temp;
    int num = 0;
    string str = "";
    while(i >= 0){
        num = (s1[i] - '0') * d + carry;
        carry = num/10;
        num %= 10;
        temp = num + '0';
        str = temp + str;
        i--;
    }
    if(carry > 0){
        char c = carry + '0';
        str = c + str;
    }
    return str;
}

int main(){
    string s1 = "";
    string s2 = "";
    cin >> s1;
    cin >> s2;
    string str = "";
    string longstr = "";
    string shortstr = "";
    string zero = "";
    if(s1.size()>s2.size()){
        longstr = s1;
        shortstr = s2;
    }
    else{
        longstr = s2;
        shortstr = s1;
    }
    for(int i = shortstr.size() - 1;i >= 0;i--){
        string s = BigIntMul(longstr,shortstr[i]-'0');
        s += zero;
        zero += '0';
        str = BigIntAdd(str,s);
    }
    //将前端的0删除
    int j = 0;
    for(;j < str.size();j++){
        if(str[j] != '0') break;
    }
    for(;j < str.size();j++){
        cout << str[j];
    }
    return 0;

}

发表于 2020-05-19 16:14:15 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main(){
    string a, b;
    cin>>a>>b;
    int n=a.length(), m=b.length();
    int s[n+m];
    memset(s, 0, sizeof(s));
    for(int i=n-1;i>=0;i--){
        int c = 0;
        for(int j=m-1;j>=0;j--){
            int k = i+j+1;
            int x = (a[i]-'0') * (b[j]-'0');
            s[k] += x + c;
            c = s[k] / 10;
            s[k] %= 10;
        }
        s[i] = c;
    }
    bool p = true;
    for(int i=0;i<n+m;i++){
        if(p){
            if(s[i]==0)
                continue;
            else
                p = false;
        }
        cout<<s[i];
    }
    cout<<endl;
    return 0;
}

发表于 2019-12-20 00:46:07 回复(0)
两个长数字字符串相乘,输出结果字符串。
1.首先直接转化为整数相乘来解决是无法绕过类型内存限制的,所以这个思路行不通。
2.模拟乘法过程,如123*27,依次求出123*7的结果和123*2的结果,将两者相加(pluss函数)。
3.对于123*7和123*2的计算由于考虑到第一点仍然不能直接转化为整型来计算,而简单而安全的
做法是如对于123*7,每一位3,2,1与7相乘是可以直接整数相乘的,那么将123*7分解为这一系列
操作即可,注意进位问题(mul函数)。

#include<iostream>
#include<string>
using namespace std;

string mul(string s,char c)
{
    string res;
    int carry=0;
    int tmp;
    for(int i=s.size()-1;i>=0;i--)
    {
        tmp=(s[i]-48)*(c-48)+carry;
        carry=tmp/10;
        res.insert(res.begin(),char(tmp%10+48));
    }
    if(carry>0)
        res.insert(res.begin(),char(carry+48));
    return res;
}

string pluss(string a,string b,int k)
{
    if(a.size()==0)
        return b;
    else{
        while(k>0)
        {
            b+='0';
            k--;
        }
        int i=a.size()-1;
        int j=b.size()-1;
        int carry=0;
        int tmp;
        while(i>=0)
        {
            tmp=(b[j]-48)+(a[i]-48)+carry;
            carry=tmp/10;
            b[j]=char(tmp%10+48);
            i--;
            j--;
        }
        while(j>=0)
        {
            tmp=(b[j]-48)+carry;
            carry=tmp/10;
            b[j]=char(tmp%10+48);
            j--;
        }
        if(carry>0)
        {
            b.insert(b.begin(),char(carry+48));
        }
        return b;
    }
}

string multiply(string s1,string s2)
{
    string res;
    string tmp;
    for(int i=s2.size()-1;i>=0;i--)
    {
        tmp=mul(s1,s2[i]);
        res=pluss(res,tmp,s2.size()-i-1);
    }
    return res;
}


int main()
{
    string s1;
    string s2;
    cin>>s1;
    cin>>s2;
    while(s1[0]=='0')
    {
        s1.erase(s1.begin());
    }
    while(s2[0]=='0')
    {
        s2.erase(s2.begin());
    }
    string res=multiply(s1,s2);
    cout<<res;
}

发表于 2019-10-21 15:30:24 回复(0)

#include<iostream>
#include<string>
using namespace std;

string BigNumMultiply(string str1, string str2)
{
    int size1 = str1.size(), size2 = str2.size(); int m = 0;
    string str(size1 + size2, '0');
    for (int i = size2 - 1; i >= 0; --i)
    {
        int mulflag = 0, addflag = 0;
        for (int j = size1 - 1; j >= 0; --j)
        {
            int temp1 = (str2[i] - '0')*(str1[j] - '0') + mulflag;
            mulflag = temp1 / 10;
            temp1 = temp1 % 10;
            int temp2 = str[i + j + 1] - '0' + temp1 + addflag;
            str[i + j + 1] = temp2 % 10 + '0';
            
            addflag = temp2 / 10;
        }
        str[i] = mulflag + addflag+'0';
    }

    while (str[m] == '0')
    {


        m++;
    }

    str = str.substr(m, str.size());
    return str;
}

int main()
{
    string str1, str2;
    while (cin >> str1 >> str2)
    {

        cout << BigNumMultiply(str1, str2) << endl;
    }
    return 0;
}
发表于 2019-09-23 21:01:26 回复(0)
#include <bits/stdc++.h>
using namespace std;
/*模拟笔算乘法*/
int main(){
    string strA,strB,ans;
    getline(cin,strA);
    getline(cin,strB);
    ans.resize(strA.size()+strB.size());
    for(int i=0;i<ans.size();i++)
        ans[i]='0';
    for(int i=strB.size()-1,q=0 ;i>=0 ;i--,q++)
    {
        int x = strB[i]-'0';    //取出当前位数,与另外的字符串相乘。
        for(int j=strA.size()-1,p=0,n=0 ;j>=0 ;j--,p++)
        {
            int y = strA[j]-'0';
            int sum=x*y;    //计算乘法
            int pos = ans.size()-1-p-q; //存放位置
            int num=ans[pos]-'0'+sum%10+n;   //进位累计到当前位置
            n=num/10;    //保留累加进位
            n+=sum/10;   //保留相乘进位
            ans[pos]=num%10+'0'; //把算好的数字放进去
            if(j==0)    //当到最高位时存放进位
                ans[ans.size()-2-p-q]=n+'0';
        }
    }
    int k=0;
    bool out=ans[0]!='0';   //最高位是否为0
    while(k<ans.size()){
        if(out)
            cout<<ans[k];
        else if(ans[k+1]!='0')
            out=true;
        k++;
    }
    return 0;
}


编辑于 2019-09-08 20:38:28 回复(0)

用系统自带的大数类的取巧做法就不说了,提供一种我们小学学的乘法相乘的做法,AC代码如下

import java.util.Scanner;
import static java.lang.System.in;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(in);
        String str1 = sc.nextLine(), str2 = sc.nextLine();
        //去掉前面的0,比如030这种数据
        int isZero = 0;
        while (str1.charAt(isZero++) == '0') ;
        str1 = str1.substring(isZero-1);
        isZero = 0;
        while (str2.charAt(isZero++) == '0') ;
        str2 = str2.substring(isZero-1);
        String timesRes = "", plusRes = "";
        for (int i = str2.length() - 1, j = 0; i >= 0; i--, j++) {
            timesRes = strTimesChar(str1, str2.charAt(i), j);
            plusRes = strAddStr(plusRes, timesRes);
        }
        System.out.println(plusRes);
    }

    public static String strTimesChar(String str, char c, int tenN) {
        int flag = 0;
        int temp = 0;
        String res = "";
        int ic = c - '0';
        for (int i = str.length() - 1; i >= 0; i--) {
            temp = (str.charAt(i) - '0') * ic + flag;
            res = (temp % 10) + res;
            flag = temp / 10;
        }
        if (flag > 0) {
            res = flag + res;
        }
        for (int i = 0; i < tenN; i++) {
            res += '0';
        }
        return res.toString();
    }

    public static String strAddStr(String str1, String str2) {
        int len1 = str1.length();
        int len2 = str2.length();
        if (len1 > len2) {
            for (int i = 0; i < len1 - len2; i++) {
                str2 = '0' + str2;
            }
        } else {
            for (int i = 0; i < len2 - len1; i++) {
                str1 = '0' + str1;
            }
        }
        int flag = 0;
        String res = "";
        int temp = 0;
        for (int i = str1.length() - 1; i >= 0; i--) {
            temp = str1.charAt(i) + str2.charAt(i) - 2 * '0' + flag;
            res = (temp % 10) + res;
            flag = temp / 10;
        }
        if (flag > 0) {
            res = flag + res;
        }
        return res;
    }
}
发表于 2019-08-08 16:35:31 回复(0)
#include<iostream>
#include<string>
using namespace std;
int main()
{
	string a, b;
	cin >> a >> b;
	int size = a.size() + b.size();
	string c(size,0);
	for (int i = a.size() - 1; i >= 0; i--)
	{
		int in_num = 0;
		for (int j = b.size() - 1; j >= 0; j--)
		{
			int tmp = (a[i] - '0')*(b[j] - '0');
			c[i + j + 1] += tmp + in_num;
			in_num = c[i + j + 1] / 10;
			c[i + j + 1] %= 10;
		}
		c[i] = in_num;
	}
	for (int i = 0; i < size; i++)	c[i] += '0';
    while(c[0]=='0')
        c.erase(0,1);
    cout<<c<<endl;
	return 0;
}


发表于 2019-08-06 12:36:39 回复(0)
""""
大数乘法,python犯规了:)
"""

if __name__ == "__main__":
    a = int(input().strip())
    b = int(input().strip())
    print(a * b)

发表于 2019-07-13 10:42:44 回复(0)
C++ 版本
#include<bits/stdc++.h>
using namespace std;
string Big_Mul(string a,string b)
{
    string result = "";
    if( (a[0] =='-' && b[0] != '-' ) || (a[0] != '-' && b[0] == '-' ) ) // 先判断符号
        result = "-";
    if(a[0] == '-')
        a.erase(a.begin());
    if(b[0] == '-')
        b.erase(b.begin()); //去除负号
    reverse(a.begin(),a.end());
    reverse(b.begin(),b.end());  //反转便于求解
    int a_length = a.length();
    int b_length = b.length();
    vector<int> res(a_length + b_length); // n位*m位最大n+m位,超出部分后面解决
    for(int i = 0;i < a_length;i++) //a
        for(int j = 0;j < b_length;j++) //b
        {
            int a_tmp = a[i]-'0';
            int b_tmp = b[j]-'0';
            res[i+j] += a_tmp * b_tmp;  // 第i * 第j 位 放在第i+j位,注意需要在原来基础上加
        }
    for(int i = 0;i < a_length + b_length;i++)
    {
        if(res[i] > 9)
        {
            res[i+1] += res[i]/10;
            res[i] = res[i]%10; //解决进位
        }
    }
    int index;
    for(index = res.size()-1;index >= 0;index--) // 找到最高位的下标
        if(res[index] != 0)
            break;
    for(int i = index;i >= 0;i--)
        result += res[i]+'0';
    return result;     // 返回结果
}
int main()
{
    string a,b;
    cin>>a;
    cin>>b;
    cout<<Big_Mul(a,b)<<endl;
    return 0;
}
发表于 2019-03-09 13:26:28 回复(0)
直接用Number() 转换为数字不就完事了么
发表于 2019-03-01 20:56:46 回复(1)
var multiply = function(num1, num2) {
    if(num1 == "0" || num2 == '0'){
        return '0' ;
    }
    var res = new Array(num1.length + num2.length) ;
    for(var i = 0; i < res.length; i ++){
        res[i] = 0 ;
    }
    
    var a = num1.split('').reverse() ;
    var b = num2.split('').reverse() ;
    
    for(var i = 0; i < a.length; i ++){
        for(var j = 0; j < b.length; j ++){
            res[i+j] += a[i]*b[j] ;
        }
    }
    
    var carry = 0 ;
    var str = [] ;
    
    for(var i = 0; i < res.length; i ++){
        res[i] += carry ;
        carry = parseInt(res[i] / 10 );
        res[i] = res[i] % 10 ;
        str[i] = res[i] ;
    }
    
    str = str.reverse().join("") ;
    
    var index = 0 ;
    while(str[index] === "0"){
        index ++ ;
    }
    
    return str.substring(index) ;
    
};
console.log(multiply(readline(),readline())) ;

发表于 2019-02-25 21:02:32 回复(10)
#include <stdio.h>
#include <string.h>
void GetMulti(char s1[], char s2[])
{
    int num1[1000], num2[1000];
    int res[1000] = {0};
    for (int i = 0; i < strlen(s1); ++i) {
        num1[strlen(s1) - i - 1] = s1[i] - '0';
    }
    for (int i = 0; i < strlen(s2); ++i) {
        num2[strlen(s2) - 1 - i] = s2[i] - '0';
    }
    for (int i = 0; i < strlen(s1); ++i) {
        for (int j = 0; j < strlen(s2); ++j) {
            res[i + j] += num1[i] * num2[j];
        }
    }
    int tmp = 0;
    for (int i = 0; i <= strlen(s1) + strlen(s2) - 1; ++i) {
        res[i] += tmp;
        tmp = res[i] / 10;
        res[i] = res[i] % 10;
    }
    tmp = strlen(s1) + strlen(s2) - 1;
    while (res[tmp] == 0) {
        --tmp;
    }
    for (int i = tmp; i >= 0; --i) {
        printf("%d", res[i]);
    }
    printf("\n");
    return;
}
int main()
{
    char str1[1000], str2[1000];
    gets(str1);
    gets(str2);
    GetMulti(str1, str2);
    return 0;
}

发表于 2020-07-18 09:30:57 回复(0)
function getMul (a, b) {
    return parseFloat(a) * parseFloat(b);
}


编辑于 2020-07-02 16:59:35 回复(0)
function getProduct(a: string, b: string) {
  let num1 = a.split('0'),
    num1Zero = num1.length - 1,
    num2 = b.split('0'),
    num2Zero = num2.length - 1;
  return (
    Number(num1[0]) * Number(num2[0]) + ''.padStart(num1Zero + num2Zero, '0')
  );
}
发表于 2020-06-26 14:59:25 回复(0)