题目链接 : 点击查看
题目描述 :
给定两个正整数 A 和 B,请你计算 A×B的值。1 ≤ A的长度 ≤ 100000 , 0≤B≤10000。
输入输出:
输入
2
3
输出
6
题目分析 :
本题A为大数类型,先用string 类进行存储 ,后将每一位转移到动态数组A中,而B的范围较小,直接用int存储即可。当然,本题的重点在于乘法模拟过程,由于B的范围较小,我们将B看成一个整体,用A的每一位分别与它相乘。在mul函数中用 carry 存储每一位的乘积,当然还要加上 上一位乘积 的进位 。具体方法为 : 先计算当前位的乘积 carry = A[ i ] * B + carry,最后加上的carry为上一位乘积的进位。因为当前位只保留个位,故将 carry % 10 存入结果数组 pdt 中,然后carry = carry / 10,表示对下一位的进位 ,之后再对下一位进行相同操作。 在for 循环中,为了防止最后一位的进位直接被忽略,循环条件除了 i < A.size() 还要有 t > 0。最后,别忘记还要去除前导 0 。详见如下代码。
代码 :
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
vector <int> mul(vector <int> &A, int B) {
vector <int> pdt;
int carry = 0;
for (int i = 0; i < A.size() || carry; i ++ ) {
if (i < A.size()) carry = B * A[i] + carry;
pdt.push_back(carry % 10);
carry /= 10;
}
while (pdt.size() > 1 && pdt.back() == 0 ) pdt.pop_back();
return pdt;
}
int main() {
string a;//a为大整数类型 需要用字符串进行存储
int b;
cin >> a >> b;
vector <int> A;
for (int i = a.size() - 1; i >= 0; i -- ) {
A.push_back(a[i] - '0');
}
vector <int> pdt = mul(A, b);
for (int i = pdt.size() - 1; i >= 0; i -- ) {
cout << pdt[i];
}
}
---------------------------------------
在此我们给出高精度乘法模板
vector<int> mul(vector<int> &A, int b)
{
vector<int> C;
int t = 0;
for (int i = 0; i < A.size() || t; i ++ )
{
if (i < A.size()) t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}