首页 > 试题广场 >

大数乘法

[编程题]大数乘法
  • 热度指数:487 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
大数指超过int64_t 可承载范围的数字




输入描述:
输入两行数n1, n2 (0 < n* < 2^100)


输出描述:
输出两数之积
示例1

输入

2
3

输出

6
示例2

输入

9223372024429430685
34223371424429430685

输出

315654886577740006976078312593219569225
/**
 * 两个大数相乘
 */
public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        BigInteger num1 = new BigInteger(sc.nextLine());
        BigInteger num2 = new BigInteger(sc.nextLine());
        BigInteger result = num1.multiply(num2);
        System.out.println(result);
    }
}

发表于 2020-07-03 11:36:27 回复(3)
a =int(input())
b =int(input())
print(a *b)
发表于 2022-08-18 12:32:31 回复(0)
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int main(){
    string num1, num2;
    cin>>num1>>num2;
    reverse(num1.begin(),num1.end());
    reverse(num2.begin(),num2.end());
    // cout<<num1.length()+num2.length();
    int *num = new int[num1.length()+num2.length()];
    for(int i=0;i<(num1.length()+num2.length());i++)
        num[i]=0;
    int carry = 0;
    int ind = 0;
    for(int i=0; i<num1.length(); i++){
        for(int j=0; j<num2.length(); j++){
            num[j+i] = (num1[i]-'0') * (num2[j]-'0') + num[j+i];
            for(int k=j+i;k<i+j+2;k++){
                if(num[k]>=10){
                    carry = num[k]/10;
                    num[k] = num[k]%10;
                    num[k+1] = carry + num[k+1];
                    if(k+1>ind)
                        ind=k+1;
                }
            }
            if(i+j>ind)
               ind=i+j;
        }
    }
    for(int i=ind;i>=0;i--)
        cout<<num[i];
    system("pause");
    return 0;
}
编辑于 2020-08-25 11:36:08 回复(1)
思路: 按照人工算数的逻辑进行推算
多位大数相乘 拆分为 多位大数与一位数相乘, 不补上0, 得出的结果相加
因此需要添加两个辅助函数
两位大数相加 Add
大数乘一位数 Multi


// 大数相加 92233720 + 3422337 > 95656057
function Add(n1, n2) {
  if (n2 == '0') {
    return n1;
  }
  if (n1 == '0') {
    return n2;
  }
  let res = [];
  let last = 0;
  let long = n1, short = n2;
  if (n2.length > n1.length) {
    long = n2;
    short = n1;
  }
  long = long.split('').reverse().join('');
  short = short.split('').reverse().join('');
  for (let i = 0; i <= long.length - 1; i++) {
    const sum = last + parseInt(long[i]) + parseInt(short[i] || 0);
    res.unshift(sum % 10); // 个位数
    last = Math.floor(sum / 10); // 十位数
  }
  if (last) {
    res.unshift(last);
  }
  // console.log('Add', n1, '+', n2, '=', res.join(''));
  return res.join('');
}

// n2 是长度为1的数 9223372024429430685 * 3
function Multi(n1, n2) {
  if (n1 == '0' || n2 == '0') {
    return '0';
  }
  if (n2 == '1') {
    return n1;
  }
  if (n1 == '1') {
    return n2;
  }
  let res = [];
  let last = 0;
  for(let i = n1.length - 1; i >= 0; i--) {
    const mul = n1[i] * n2 + last;
    res.unshift(mul % 10); // 个位数
    last = Math.floor(mul/10); // 十位数
  }
  if (last) {
    res.unshift(last);
  }
  // console.log('Multi', n1, '*', n2, '=', res.join(''));
  return res.join('');
}

function BigNum(n1, n2) {
  if (n1 == '0' || n2 == '0') {
    return '0';
  }
  if (n2 == '1') {
    return n1;
  }
  if (n1 == '1') {
    return n2;
  }
  let res = '0';
  for(let i = 0; i < n2.length; i++) {
    res = Add(res, Multi(n1, n2[i]) + (new Array(n2.length - 1 - i).fill(0).join('')))
  }
  return res;
}

let line;
let lines = [];
while (line = readline()) {
  lines.push(line);
}
const [n1, n2] = lines;
print(BigNum(n1, n2));

发表于 2020-02-12 12:02:09 回复(0)
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
 
using namespace std;
 
 
 
//加法
string add(string input_1, string input_2) {
    string ans = "";
    int tem = 0;
    int max, min, mid;
    int flag = 0;
    if (input_1.length() >= input_2.length()) {
        max = input_1.length();
        min = input_2.length();
        flag = 1;
    } else {
        max = input_2.length();
        min = input_1.length();
        flag = 2;
    }
    mid = max - min;
    vector<int> number;
    for (int i = max - 1; i >= 0; --i) {
        if (i >= mid) {
            int a;
            if (flag == 1) {
                a = input_1[i] - '0' + input_2[i - mid] - '0' + tem;
            } else {
                a = input_1[i - mid] - '0' + input_2[i] - '0' + tem;
            }
            tem = a / 10;
            number.push_back(a % 10);
        } else {
            int b, c;
            if (flag == 1) {
                b = input_1[i];
                c = '0';
            } else {
                b = '0';
                c = input_2[i];
            }
            int a = b - '0' + c - '0' + tem;
            tem = a / 10;
            number.push_back(a % 10);
        }
    }
    if (tem != 0)number.push_back(tem);
    for (int j = number.size() - 1; j >= 0; --j) {
        ans += number.at(j) + '0';
    }
    return ans;
}
 
//整数乘法——根据正常笔算乘法过程计算
string multipy(string input, string mul) {
    int ult = 0;
    string tem;
    string ans = "";
    for (int i = mul.length() - 1; i >= 0; --i) {
        vector<int> res;
        int rem = 0;
        tem = "";
        for (int j = input.length() - 1; j >= 0; --j) {
            int cur = rem + (input[j] - '0') * (mul[i] - '0');
            res.push_back(cur % 10);
            rem = cur / 10;
        }
        if (rem != 0)
            res.push_back(rem);
        for (int k = res.size() - 1; k >= 0; --k) {
            tem += res.at(k) + '0';//根据每位数字所在位进行加乘
        }
        for (int l = 0; l < ult; ++l) {
            tem += "0";
        }
        ans = add(ans, tem);
        ult++;//移位符号
    }
    return ans;
}
int main(){
    string mul;
    string input;
    cin>>mul>>input;
    cout << multipy(input, mul) << endl;
}

发表于 2020-02-06 13:42:03 回复(0)