高精度库
  • 板块灌水区
  • 楼主Gold_Dino
  • 当前回复12
  • 已保存回复12
  • 发布时间2022/6/12 11:41
  • 上次更新2023/10/27 23:28:18
查看原帖
高精度库
422171
Gold_Dino楼主2022/6/12 11:41
#include <bits/stdc++.h>
using namespace std;
struct HPV{
	int Len;
	int A[905];
	HPV(){
		Len = 0;
		memset(A, 0, sizeof(A));
	}
	void Read(){
		string str;
		int i;
		cin >> str;
		Len = str.size();
		for (i = 1; i <= Len; i++)
			A[i] = str[i - 1] - '0';
		reverse(A + 1, A + Len + 1);
	}
	void Read(int x){
		int i = 0;
		while (x){
			A[++i] = x % 10;
			x /= 10;
		}
		Len = i;
		return;
	}
	void Read(string str){
		int i;
		Len = str.size();
		for (i = 1; i <= Len; i++)
			A[i] = str[i - 1] - '0';
		reverse(A + 1, A + Len + 1);
	}
	void Out(){
		int i;
		for (i = Len; i >= 1; i--)
			cout << A[i];
		return;
	}
	HPV operator + (const HPV x) const
	{
		HPV Ans;
		int i;
		Ans.Len = max(Len, x.Len);
		memset(Ans.A, 0, sizeof(Ans.A));
		for (i = 1; i <= Ans.Len; i++){
			Ans.A[i] += A[i] + x.A[i];
			if (Ans.A[i] > 9){
				Ans.A[i + 1]++;
				Ans.A[i] %= 10;
			}
		}
		while (Ans.A[Ans.Len + 1] > 0)
			Ans.Len++;
		return Ans;
	}
	void operator += (const HPV x)
	{
		HPV Ans;
		for (int i = 1; i <= Len; i++)
			Ans.A[i] = A[i];
		Ans.Len = Len;
		Ans = Ans + x;
		for (int i = 1; i <= Ans.Len; i++)
			this -> A[i] = Ans.A[i];
		this -> Len = Ans.Len;
		return;
	}
	HPV operator - (const HPV x) const
	{
		HPV Ans;
		int i;
		Ans.Len = max(Len, x.Len);
		memset(Ans.A, 0, sizeof(Ans.A));
		for (i = 1; i <= Ans.Len; i++){
			Ans.A[i] = A[i] - x.A[i];
			if (Ans.A[i] < 0){
				Ans.A[i + 1]--;
				Ans.A[i] += 10;
			}
		}
		while (Ans.A[Ans.Len] == 0)
			Ans.Len--;
		return Ans;
	}
	void operator -= (const HPV x)
	{
		HPV Ans;
		for (int i = 1; i <= Len; i++)
			Ans.A[i] = A[i];
		Ans.Len = Len;
		Ans = Ans - x;
		for (int i = 1; i <= Ans.Len; i++)
			this -> A[i] = Ans.A[i];
		this -> Len = Ans.Len;
		return;
	}
	HPV operator * (const HPV x) const
	{
		HPV Ans;
		int i, j;
		Ans.Len = Len + x.Len;
		memset (Ans.A, 0, sizeof(Ans.A));
		for (i = 1; i <= Len; i++)
			for (j = 1; j <= x.Len; j++)
				Ans.A[i + j - 1] += A[i] * x.A[j];
		for (i = 1; i <= Ans.Len; i++)
			if (Ans.A[i] > 9){
				Ans.A[i + 1] += Ans.A[i] / 10;
				Ans.A[i] %= 10;
			}
		while (Ans.A[Ans.Len] == 0)
			Ans.Len--;
		return Ans;
	}
	void operator *= (const HPV x)
	{
		HPV Ans;
		for (int i = 1; i <= Len; i++)
			Ans.A[i] = A[i];
		Ans.Len = Len;
		Ans = Ans * x;
		for (int i = 1; i <= Ans.Len; i++)
			this -> A[i] = Ans.A[i];
		this -> Len = Ans.Len;
		return;
	}
	void operator = (const string str)
	{
		this -> Read(str);
		return;
	}
	void operator = (const int x)
	{
		this -> Read(x);
		return;
	}
	int operator > (const HPV x) const
	{
		int i;
		if (Len > x.Len)
			return 1;
		if (Len < x.Len)
			return 0;
		for (i = Len; i >= 1; i--){
			if (A[i] > x.A[i])
				return 1;
			if (A[i] < x.A[i])
				return 0;
		}
		return 0;
	}
	HPV operator / (const HPV x) const
	{
		HPV cn, c;
		cn = 1;
		c = 0;
		HPV Ans, Ans2;
		Ans2 = 0;
		for (int i = 1; i <= Len; i++)
			Ans.A[i] = A[i];
		Ans.Len = Len;
		while (Ans > c){
			Ans -= x;
			Ans2 += cn;
		}
		return Ans2;
	}
};
typedef struct _InHpv{
	void operator >> (HPV & x) const
	{
		x.Read();
		return;
	}
} InHpv;
InHpv hin;
typedef struct _OutHpv{
	void operator << (HPV x) const
	{
		x.Out();
		return;
	}
} OutHpv;
OutHpv hout;
2022/6/12 11:41
加载中...