高精度模板

高精度模板

#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
const int N = 1257, M = 1e8;
using LL = long long;
struct BigN {
	LL a[N], len;
	BigN() { len = 0; memset(a, 0, sizeof a); }
	void init(string s) {
		int i = s.size() - 8;
		while (i >= 0)
			a[++len] = stoi(s.substr(i, 8)), i -= 8;
		if (i > -8)
			a[++len] = stoi(s.substr(0, i+8));
	}
	BigN operator/ (const LL &x) {
		LL r = 0;
		BigN ans = *this;
		for (int i = len; i; --i) {
			ans.a[i] = (a[i] + r*M) / x;
			r = (a[i] + r*M) % x;
		}
		while (ans.len>1 && !ans.a[ans.len]) --ans.len;
		return ans;
	}
	BigN operator- (const BigN &B) {
		// 此处默认结果为正
		BigN ans = *this;
		for (int i = 1; i <= len; ++i) {
			ans.a[i] -= B.a[i];
			if (ans.a[i] < 0) ans.a[i] += M, --ans.a[i+1];
		}
		while(ans.len>1 && !ans.a[ans.len]) --ans.len;
		return ans;
	}
	BigN operator+ (const BigN &B) {
		BigN ans = *this;
		ans.len = max(ans.len, B.len) + 1;
		for (int i = 1; i <= ans.len; ++i) {
			ans.a[i] += B.a[i];
			if (ans.a[i] >= M) ans.a[i] -= M, ++ans.a[i+1];
		}
		while(ans.len>1 && !ans.a[ans.len]) --ans.len;
		return ans;
	}
	bool operator>= (const BigN &B) {
		if (len != B.len) return len > B.len;
		for (int i = len; i; --i)
			if (a[i] != B.a[i]) return a[i] > B.a[i];
		return true;
	}
	BigN operator* (const BigN &B) {
		BigN ans;
		ans.len = len + B.len;
		for (int i = 1; i <= ans.len; ++i) ans.a[i] = 0;
		for (int i = 1; i <= len; ++i)
			for (int j = 1; j <= B.len; ++j) {
				ans.a[i+j-1] += a[i] * B.a[j];
				ans.a[i+j] += ans.a[i+j-1]/M;
				ans.a[i+j-1] %= M;
			}
		while (ans.len>1 && !ans.a[ans.len]) --ans.len;
		return ans;
	}
	BigN operator* (const int &x) {
		BigN B;
		B.init(to_string(x));
		return *this * B;
	}
	bool even() { return !(a[1] & 1); }
	void print() {
		printf("%lld", a[len]);
		for (int i = len-1; i; --i)
			printf("%08lld", a[i]);
		puts("");
	}
} a, b, ans;
int main() {
	string sa, sb;
	cin >> sa >> sb;
	a.init(sa), b.init(sb);
	ans.init("1");
	while (!(a>=b) || !(b>=a)) {
		bool fa = a.even(), fb = b.even();
		if (fa && fb) a = a/2, b = b/2, ans = ans*2;
		else if (fa) a = a/2;
		else if (fb) b = b/2;
		else if (a >= b) a = a - b;
		else b = b - a;
	}
	ans = ans * a;
	ans.print();
	return 0;
}

posted @ 2024-04-14 11:39  飞花阁  阅读(33)  评论(0)    收藏  举报
//雪花飘落效果