静态数组再实现
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
struct HP {
int num[N];
int len;
}tmp;
HP ToHP(const string &str) {
memset(&tmp, 0, sizeof(HP));
tmp.len = str.size();
for(int i = tmp.len-1; i >= 0; i --)
tmp.num[i] = str[tmp.len-i-1]-'0';
return tmp;
}
HP ToHP(LL num) {
memset(&tmp, 0, sizeof(HP));
while(num) {
tmp.num[tmp.len ++] = num%10;
num /= 10;
}
return tmp;
}
int HHCmp(const HP &a, const HP &b) {
if(a.len > b.len) return 1;
else if(a.len < b.len) return -1;
else {
for(int i = a.len-1; i >= 0; i --) {
if(a.num[i] > b.num[i]) return 1;
else if(a.num[i] < b.num[i]) return -1;
}
}
return 0;
}
HP HHAdd(const HP &a, const HP &b) {
memset(&tmp, 0, sizeof(HP));
int r = 0, len = max(a.len, b.len);
for(int i = 0; i < len || r; i ++) {
if(i < len) r += a.num[i]+b.num[i];
tmp.num[tmp.len ++] = r%10;
r /= 10;
}
return tmp;
}
HP HHSub(const HP &a, const HP &b, bool &is_posi) {
memset(&tmp, 0, sizeof(HP));
int t = HHCmp(a, b);
if(t < 0) {
HP res = HHSub(b, a, is_posi);
is_posi = false;
return res;
}
else is_posi = true;
int r = 0;
for(int i = 0; i < a.len; i ++){
r = a.num[i]-r;
if(i < b.len) r -= b.num[i];
tmp.num[tmp.len ++] = (r+10)%10;
if(r < 0) r = 1;
else r = 0;
}
while(tmp.len > 1 && tmp.num[tmp.len-1] == 0) tmp.len --;
return tmp;
}
HP HHMul(const HP &a, const HP &b) {
memset(&tmp, 0, sizeof(HP));
tmp.len = a.len+b.len;
for(int i = 0; i < a.len; i ++)
for(int j = 0; j < b.len; j ++) {
tmp.num[i+j] += a.num[i]*b.num[j];
tmp.num[i+j+1] += tmp.num[i+j]/10;
tmp.num[i+j] = tmp.num[i+j]%10;
}
while(tmp.len > 1 && tmp.num[tmp.len-1] == 0) tmp.len --;
return tmp;
}
HP HLDiv(const HP &a, const int &b, int &r) {
memset(&tmp, 0, sizeof(HP));
r = 0;
tmp.len = a.len;
for(int i = a.len-1; i >= 0; i --) {
r = r*10+a.num[i];
tmp.num[i] = r / b;
r = r % b;
}
while(tmp.len > 1 && !tmp.num[tmp.len-1]) tmp.len --;
return tmp;
}
void HPrint(const HP &a) {
for(int i = a.len-1; i >= 0; i --)
cout << a.num[i];
cout << '\n';
}
int main() {
string s1, s2;
cin >> s1 >> s2;
HP a = ToHP(s1), b = ToHP(s2), res;
res = HLMul(a, b);
HPrint(res);
return 0;
}
结构体(静态数组)实现
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 1e5 + 10;
struct HP
{
int num[N];
int len;
}tmp;
inline int HHcmp(const HP &a, const HP &b)
{
if(a.len > b.len) return 1;
if(a.len < b.len) return -1;
for(int i = a.len-1; i >= 0; i --)
if(a.num[i] > b.num[i]) return 1;
else if(a.num[i] < b.num[i]) return -1;
return 0;
}
inline HP HLadd(const HP &a, const int &b)
{
memset(&tmp, 0, sizeof(HP));
int t = 0;
t += b;
for(int i = 0; i < a.len || t; i ++)
{
if(i < a.len) t += a.num[i];
tmp.num[tmp.len ++] = t%10;
t /= 10;
}
return tmp;
}
inline HP HHadd(const HP &a, const HP &b)
{
memset(&tmp, 0, sizeof(HP));
int t = 0;
for(int i = 0; i < a.len || i < b.len || t; i ++)
{
if(i < a.len) t += a.num[i];
if(i < b.len) t += b.num[i];
tmp.num[tmp.len ++] = t%10;
t /= 10;
}
return tmp;
}
inline HP HHsub(const HP &a, const HP &b, bool &posi) // 是负数传出的posi = flase
{
if(HHcmp(a, b) < 0)
{
posi = false;
return HHsub(b, a, posi);
}
memset(&tmp, 0, sizeof(HP));
int t = 0;
for(int i = 0; i < a.len; i ++)
{
t = a.num[i] - t;
if(i < b.len) t -= b.num[i];
tmp.num[tmp.len ++] = (t+10)%10;
if(t < 0) t = 1;
else t = 0;
}
while(tmp.len > 1 && tmp.num[tmp.len-1] == 0) tmp.len --;
return tmp;
}
inline HP HLmul(const HP &a, const int &b)
{
memset(&tmp, 0, sizeof(HP));
int t = 0;
for(int i = 0; i < a.len || t; i ++)
{
if(i < a.len) t += a.num[i]*b;
tmp.num[tmp.len ++] = t%10;
t /= 10;
}
while(tmp.len > 1 && tmp.num[tmp.len-1] == 0) tmp.len --;
return tmp;
}
inline HP HHmul(const HP &a, const HP &b)
{
memset(&tmp, 0, sizeof(HP));
tmp.len = a.len+b.len;
for(int i = 0; i < a.len; i ++)
for(int j = 0; j < b.len; j ++)
{
tmp.num[i+j] += a.num[i]*b.num[j];
tmp.num[i+j+1] += tmp.num[i+j]/10;
tmp.num[i+j] = tmp.num[i+j]%10;
}
while(tmp.len > 1 && tmp.num[tmp.len-1] == 0) tmp.len --;
return tmp;
}
inline HP HLdiv(const HP &a, const int &b, int &r)
{
memset(&tmp, 0, sizeof(HP));
r = 0;
tmp.len = a.len;
for(int i = a.len-1; i >= 0; i --)
{
r = r*10+a.num[i];
tmp.num[i] = r / b;
r = r % b;
}
while(tmp.len > 1 && !tmp.num[tmp.len-1]) tmp.len --;
return tmp;
}
inline void Hprint(const HP &a)
{
for(int i = a.len-1; i >= 0; i --)
cout << a.num[i];
cout << endl;
}
int c;
HP a, b, res;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
char s1[N], s2[N];
cin >> s1;
cin >> s2;
for(int i = 0; s1[i]; i ++) a.num[a.len ++] = s1[i]-'0';
for(int i = 0; s2[i]; i ++) b.num[b.len ++] = s2[i]-'0';
reverse(a.num, a.num + a.len);
reverse(b.num, b.num + b.len);
// cin >> c;
// for(int i = a.len-1; i >= 0; i --) cout << a.num[i];
// cout << endl;
res = HHmul(a, b);
Hprint(res);
return 0;
}
vector<int>
实现 - 在算法时间复杂度比较高?慎用vector的高精贴题TLE2个点
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
vector<int> a, b;
inline int HHcmp(const vector<int> &a, const vector<int> &b)
{
if(a.size() > b.size()) return 1;
if(a.size() < b.size()) return -1;
for(int i = a.size()-1; i >= 0; i --)
if(a[i] > b[i]) return 1;
else if(a[i] < b[i]) return -1;
return 0;
}
inline vector<int> HLadd(const vector<int> &a, int b)
{
vector<int> c;
int t = 0;
t += b;
for(int i = 0; i < a.size() || t; i ++)
{
if(i < a.size()) t += a[i];
c.push_back(t % 10);
t /= 10;
}
return c;
}
inline vector<int> HHadd(const vector<int> &a, const vector<int> &b)
{
vector<int> c;
int t = 0;
for(int i = 0; i < a.size() || i < b.size() || t; i ++)
{
if(i < a.size()) t += a[i];
if(i < b.size()) t += b[i];
c.push_back(t % 10);
t /= 10;
}
return c;
}
inline vector<int> HHsub(const vector<int> &a, const vector<int> &b)
{
vector<int> c;
if(HHcmp(a, b) < 0)
{
cout << "-";
return HHsub(b, a);
}
int t = 0;
for(int i = 0; i < a.size(); i ++)
{
t = a[i] - t;
if(i < b.size()) t -= b[i];
c.push_back((t+10) % 10);
if(t < 0) t = 1;
else t = 0;
}
while(c.size() > 1 && c.back() == 0) c.pop_back();
return c;
}
inline vector<int> HLmul(const vector<int> &a, const 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;
}
inline vector<int> HLdiv(const vector<int> &a, const int b, int &r)
{
vector<int> c;
r = 0;
for(int i = a.size()-1; i >= 0; i --)
{
r = r * 10 + a[i];
c.push_back(r / b);
r %= b;
}
reverse(c.begin(), c.end());
while(c.size() > 1 && c.back() == 0) c.pop_back();
return c;
}
inline void Hprint(const vector<int> &a)
{
for(int i = a.size()-1; i >= 0; i --)
cout << a[i];
cout << endl;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
string s1, s2;
cin >> s1 >> s2;
for(int i = s1.size()-1; i >= 0; i --) a.push_back(s1[i]-'0');
for(int i = s2.size()-1; i >= 0; i --) b.push_back(s2[i]-'0');
Hprint(HHadd(a, b));
return 0;
}