AcWing 793. 高精度乘法
原题链接
简单
作者:
fangqing
,
2021-03-25 15:26:23
,
所有人可见
,
阅读 321
我自己的学习笔记,以备复习
高精度算法Axb型
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
vector < int > cum (vector < int > & A , int b) //vector值得传递
{
int t = 0;
vector < int > c; //定义一个vector变量,存储答案
for(int i = 0 ; i < A.size() ; i++)
{
t += A[i] * b; //用t来表示当前位的大小
c.push_back( t%10 );
t /= 10;
}
while( t )
{
c.push_back( t%10 ); //push_back最后一个元素
t /= 10;
}
while( c.size() > 1 && c.back() == 0)c.pop_back();//除去前导零,这题没必要,但使代码更加完美
return c;
}
int main()
{
string a;
int b;
vector < int > A , C;
cin >> a >> b;
for(int i = a.size() - 1 ; i >= 0 ; i--)A.push_back( a[i] - '0' );//倒序输入方便进位
C = cum( A , b ); //函数调用
for(int i = C.size() - 1 ; i >= 0 ; i--)printf("%d" , C[i]); //倒序输出
return 0;
}
双高精度算法AxA型
#include <iostream>
#include <vector>
using namespace std;
vector < int > mul(vector < int > & A , vector < int > & B)
{
vector < int > C( A.size() + B.size(), 0); // 初始化为 0,且999*99最多 5 位
for (int i = 0; i < A.size(); i++)
for (int j = 0; j < B.size(); j++)
C[i + j] += A[i] * B[j];
int t = 0;
for (int i = 0; i < C.size(); i++)
{ // i = C.size() - 1时 t 一定小于 10
t += C[i];
C[i] = t % 10;
t /= 10;
}
while (C.size() > 1 && C.back() == 0) C.pop_back(); // 必须要去前导 0,因为最高位很可能是 0
return C;
}
int main()
{
string a, b;
cin >> a >> b; // a = "1222323", b = "2323423423"
vector < int > A, B;
for (int i = a.size() - 1; i >= 0; i--) A.push_back( a[i] - '0' );
for (int i = b.size() - 1; i >= 0; i--) B.push_back( b[i] - '0' );
auto C = mul( A , B );
for (int i = C.size() - 1; i >= 0; i--)
cout << C[i];
return 0;
}