Title

高精重载版(持续更新中)

这个更好用了~

正文

之前发了一篇博文,讲的是如何把高精定义为结构体,今天我们来讲讲如何把高精重载运算符,能够更加方便的使用

首先是重载运算符,这个其实很简单

bool operator 重载的符号 (符号后进行运算的变量){
    //这里写运算代码,记得把运算符前的变量以结构体内参数的形式写入
}

然后高精函数部分和之前的是一样的

inline void copynum(int x[],int &cnt,int &f,T num){
		if(num<0) f=-1,num=-num;else f=1;cnt=0;
		while(num>0) x[++cnt]=num%10,num/=10;
		while(x[cnt]==0&&cnt>0) cnt--;
		if(cnt==0) cnt++,x[cnt]=0;
	}
	inline bool ismax(int x1[], int cnt1, int f1, int x2[], int cnt2, int f2) {//判断数x1是不是更大
		if (f1 > f2) return true;
		else if (cnt1 > cnt2) return true;
		else if (f1 < f2) return false;
		else if (cnt1 < cnt2) return false;
		bool ismax = true;
		for (int i = cnt1; i >= 1; i--) if (x1[i] < x2[i]) return false;
		return true;
	}
	inline bool ismin(int x1[], int cnt1, int f1, int x2[], int cnt2, int f2) {//判断数x1是不是更小
		if (f1 > f2) return false;
		else if (cnt1 > cnt2) return false;
		else if (f1 < f2) return true;
		else if (cnt1 < cnt2) return true;
		bool ismax = true;
		for (int i = cnt1; i >= 1; i--) if (x1[i] > x2[i]) return false;
		return true;
	}
	inline void add(int x1[],int cnt1,int x2[],int cnt2,int ans[],int &cnt){
		int anscnt=cnt;int anst[N];int x=0;
		for(int i=1;i<=cnt;i++) anst[i]=ans[i];
		int len=max(cnt1,cnt2);anscnt=0;
		if(len==cnt1) for(int i=cnt2+1;i<=len;i++) x2[i]=0;
		else for(int i=cnt1+1;i<=len;i++) x1[i]=0;
		for(int i=1;i<=len;i++){
			anst[++anscnt]=(x1[i]+x2[i]+x)%10;
			x=(x1[i]+x2[i]+x)/10;
		}
		if(x>0) anst[++anscnt]=x;
		while(!anst[anscnt]&&anscnt>0) anscnt--;
		if(anscnt==0) anscnt=1;cnt=anscnt;
		for(int i=1;i<=anscnt;i++) ans[i]=anst[i];
	}
	inline void minus(int x1[],int cnt1,int x2[],int cnt2,int anst[],int &cnt,int &ansf){
		int cntans=cnt;int ans[N];int f=ansf;
		for(int i=1;i<=cnt;i++) ans[i]=anst[i];
		if (ismin(x1, cnt1, 1, x2, cnt2, 1)) {
			copy(x2, cnt2, 1, ans, cntans, f); f = -f;
			for (int i = cnt1; i >= 1; i--) {
				if (ans[i] < x1[i]) {
					int cnt = i + 1; ans[i] = ans[i] + 10 - x1[i];
					while (ans[cnt] == 0 && cnt <= cntans) ans[cnt] = 9, cnt++;
					ans[cnt]--; while (ans[cntans] == 0) cntans--;
				}
				else ans[i] -= x1[i];
			}while (cntans > 0 && ans[cntans] == 0) cntans--; if (cntans == 0) cntans++;
		}
		else {
			copy(x1, cnt1, 1, ans, cntans, f);
			for (int i = cnt2; i >= 1; i--) {
				if (ans[i] < x2[i]) {
					int cnt = i + 1; ans[i] = ans[i] + 10 - x2[i];
					while (ans[cnt] == 0 && cnt <= cntans) ans[cnt] = 9, cnt++;
					ans[cnt]--; while (ans[cntans] == 0) cntans--;
				}
				else ans[i] -= x2[i];
			}while (ans[cntans] == 0) cntans--; if (cntans == 0) cntans++;
		}
		cnt=cntans;ansf=f;if(cnt==1&&ans[1]==0) ansf=1;
		for(int i=1;i<=cntans;i++) anst[i]=ans[i];
	}
	inline void multiply(int x1[],int cnt1,int f1,int x2[],int cnt2,int f2,int ans[],int &cnt,int &f){
		f=f1*f2;cnt=cnt1+cnt2+1;int anst[N],ansf=f,cntans=cnt;
		for(int i=1;i<=cntans;i++) anst[i]=0;
		for(int i=1;i<=cnt1;i++){
			int temp=0;
			for(int j=1;j<=cnt2;j++){
				anst[i+j-1]=(x1[i]*x2[j]+temp+anst[i+j-1]);
				temp=(x1[i]*x2[j]+anst[i+j-1]+temp)/10;
				anst[i+j-1]%=10;
			}
			anst[i+cnt2]=temp;
		}
		while(anst[cntans]==0&&cntans>0) cntans--;
		if(cntans==0) cntans=1,ansf=1;
		for(int i=1;i<=cntans;i++) ans[i]=anst[i];
		cnt=cntans;f=ansf;return;
	}

​

封装部分直接传参就可以了,因为是带符号的高精,所以在加减法的时候判断一下,如果一正一负加变减,这里我稍微多写了一点,使得高精可以和普通整数类型的变量进行运算

	inline void operator += (Num b){
		if (f < 0 && b.f>0) minus(b.num, b.cnt, num, cnt, num, cnt, f);
		else if (f > 0 && b.f < 0) minus(num, cnt, b.num, b.cnt, num, cnt, f);
		else {add(num, cnt, b.num, b.cnt, num, cnt); }
	}
	inline void operator -= (Num b){
		if (b.f < 0 && f>0) { f = 1; add(num, cnt, b.num, b.cnt, num, cnt); }
		else if (f < 0 && b.f>0) { f = -1; add(num, cnt, b.num, b.cnt, num, cnt); }
		else if (f > 0 && b.f > 0) minus(num, cnt, b.num, b.cnt, num, cnt, f);
		else if (f < 0 && b.f < 0) minus(b.num, b.cnt, num, cnt, num, cnt, f);
	}
	inline Num operator + (Num b){
		Num c;if (f < 0 && b.f>0) minus(b.num, b.cnt, num, cnt, c.num, c.cnt, c.f);
		else if (f > 0 && b.f < 0) minus(num, cnt, b.num, b.cnt, c.num, c.cnt, c.f);
		else {add(num, cnt, b.num, b.cnt, c.num, c.cnt); }return c;
	}
	inline Num operator - (Num b){
		Num c;if (b.f < 0 && f>0) { f = 1; add(num, cnt, b.num, b.cnt, c.num, c.cnt); }
		else if (f < 0 && b.f>0) { f = -1; add(num, cnt, b.num, b.cnt, c.num, c.cnt); }
		else if (f > 0 && b.f > 0) minus(num, cnt, b.num, b.cnt, c.num, c.cnt, c.f);
		else if (f < 0 && b.f < 0) minus(b.num, b.cnt, num, cnt, c.num, c.cnt, c.f);
		return c;
	}
	inline void operator = (Num b){copy(b.num,b.cnt,b.f,num,cnt,f);}
	template<typename T>inline void operator = (T b){copynum(num,cnt,f,b);}
	inline void operator ++ (){
		Num c;c=1;
		if (f < 0 && c.f>0) minus(c.num, c.cnt, num, cnt, num, cnt, f);
		else if (f > 0 && c.f < 0) minus(num, cnt, c.num, c.cnt, num, cnt, f);
		else {add(num, cnt, c.num, c.cnt, num, cnt); }
	}
	inline void operator -- (){
		Num c;c=-1;
		if (f < 0 && c.f>0) minus(c.num, c.cnt, num, cnt, num, cnt, f);
		else if (f > 0 && c.f < 0) minus(num, cnt, c.num, c.cnt, num, cnt, f);
		else {add(num, cnt, c.num, c.cnt, num, cnt); }
	}
	inline bool operator >= (Num b){return ismax(num,cnt,f,b.num,b.cnt,b.f);}
	template<typename T>inline bool operator >= (T b){
		Num c;c=b;return ismax(num,cnt,f,c.num,c.cnt,c.f);
	}
	inline bool operator <= (Num b){return ismin(num,cnt,f,b.num,b.cnt,b.f);}
	template<typename T>inline bool operator <= (T b){
		Num c;c=b;return ismin(num,cnt,f,c.num,c.cnt,c.f);
	}
	inline bool operator == (Num b){
		return ismax(num,cnt,f,b.num,b.cnt,b.f)&&ismin(num,cnt,f,b.num,b.cnt,b.f);
	}
	template<typename T>inline bool operator == (T b){
		Num c;c=b;
		return ismin(num,cnt,f,c.num,c.cnt,c.f)&&ismax(num,cnt,f,b.num,b.cnt,b.f);
	}
	inline bool operator > (Num b){return !ismin(num,cnt,f,b.num,b.cnt,b.f);}
	inline bool operator < (Num b){return !ismax(num,cnt,f,b.num,b.cnt,b.f);}
	template<typename T>inline bool operator > (T b){
		Num c;c=b;return !ismin(num,cnt,f,c.num,c.cnt,c.f);
	}
	template<typename T>inline bool operator < (T b){
		Num c;c=b;return !ismax(num,cnt,f,c.num,c.cnt,c.f);
	}
	inline Num operator * (Num b){
		Num c;
		multiply(num,cnt,f,b.num,b.cnt,b.f,c.num,c.cnt,c.f);
		return c;
	}
	inline void operator *= (Num b){multiply(num,cnt,f,b.num,b.cnt,b.f,num,cnt,f);}

喜闻乐见的完整代码

#include<bits/stdc++.h>
using namespace std;
struct Num{
	#define N 25
	int num[N],cnt,f;
	inline int getnum(int x[],int cnt,int f){
		int num=0;
		for(int i=cnt;i>=1;i--) 
			num=num*10+x[i];
		return num;
	}
	inline void copy(int x1[], int cnt1, int f1, int x2[], int& cnt2, int& f2) {//把高精度数x1完全复制给高精度数ans
		for (int i = 1; i <= cnt1; i++) x2[i] = x1[i];
		cnt2 = cnt1; f2 = f1;
	}template<typename T>
	inline void copynum(int x[],int &cnt,int &f,T num){
		if(num<0) f=-1,num=-num;else f=1;cnt=0;
		while(num>0) x[++cnt]=num%10,num/=10;
		while(x[cnt]==0&&cnt>0) cnt--;
		if(cnt==0) cnt++,x[cnt]=0;
	}
	inline bool ismax(int x1[], int cnt1, int f1, int x2[], int cnt2, int f2) {//判断数x1是不是更大
		if (f1 > f2) return true;
		else if (cnt1 > cnt2) return true;
		else if (f1 < f2) return false;
		else if (cnt1 < cnt2) return false;
		bool ismax = true;
		for (int i = cnt1; i >= 1; i--) if (x1[i] < x2[i]) return false;
		return true;
	}
	inline bool ismin(int x1[], int cnt1, int f1, int x2[], int cnt2, int f2) {//判断数x1是不是更小
		if (f1 > f2) return false;
		else if (cnt1 > cnt2) return false;
		else if (f1 < f2) return true;
		else if (cnt1 < cnt2) return true;
		bool ismax = true;
		for (int i = cnt1; i >= 1; i--) if (x1[i] > x2[i]) return false;
		return true;
	}
	inline void add(int x1[],int cnt1,int x2[],int cnt2,int ans[],int &cnt){
		int anscnt=cnt;int anst[N];int x=0;
		for(int i=1;i<=cnt;i++) anst[i]=ans[i];
		int len=max(cnt1,cnt2);anscnt=0;
		if(len==cnt1) for(int i=cnt2+1;i<=len;i++) x2[i]=0;
		else for(int i=cnt1+1;i<=len;i++) x1[i]=0;
		for(int i=1;i<=len;i++){
			anst[++anscnt]=(x1[i]+x2[i]+x)%10;
			x=(x1[i]+x2[i]+x)/10;
		}
		if(x>0) anst[++anscnt]=x;
		while(!anst[anscnt]&&anscnt>0) anscnt--;
		if(anscnt==0) anscnt=1;cnt=anscnt;
		for(int i=1;i<=anscnt;i++) ans[i]=anst[i];
	}
	inline void minus(int x1[],int cnt1,int x2[],int cnt2,int anst[],int &cnt,int &ansf){
		int cntans=cnt;int ans[N];int f=ansf;
		for(int i=1;i<=cnt;i++) ans[i]=anst[i];
		if (ismin(x1, cnt1, 1, x2, cnt2, 1)) {
			copy(x2, cnt2, 1, ans, cntans, f); f = -f;
			for (int i = cnt1; i >= 1; i--) {
				if (ans[i] < x1[i]) {
					int cnt = i + 1; ans[i] = ans[i] + 10 - x1[i];
					while (ans[cnt] == 0 && cnt <= cntans) ans[cnt] = 9, cnt++;
					ans[cnt]--; while (ans[cntans] == 0) cntans--;
				}
				else ans[i] -= x1[i];
			}while (cntans > 0 && ans[cntans] == 0) cntans--; if (cntans == 0) cntans++;
		}
		else {
			copy(x1, cnt1, 1, ans, cntans, f);
			for (int i = cnt2; i >= 1; i--) {
				if (ans[i] < x2[i]) {
					int cnt = i + 1; ans[i] = ans[i] + 10 - x2[i];
					while (ans[cnt] == 0 && cnt <= cntans) ans[cnt] = 9, cnt++;
					ans[cnt]--; while (ans[cntans] == 0) cntans--;
				}
				else ans[i] -= x2[i];
			}while (ans[cntans] == 0) cntans--; if (cntans == 0) cntans++;
		}
		cnt=cntans;ansf=f;if(cnt==1&&ans[1]==0) ansf=1;
		for(int i=1;i<=cntans;i++) anst[i]=ans[i];
	}
	inline void multiply(int x1[],int cnt1,int f1,int x2[],int cnt2,int f2,int ans[],int &cnt,int &f){
		f=f1*f2;cnt=cnt1+cnt2+1;int anst[N],ansf=f,cntans=cnt;
		for(int i=1;i<=cntans;i++) anst[i]=0;
		for(int i=1;i<=cnt1;i++){
			int temp=0;
			for(int j=1;j<=cnt2;j++){
				anst[i+j-1]=(x1[i]*x2[j]+temp+anst[i+j-1]);
				temp=(x1[i]*x2[j]+anst[i+j-1]+temp)/10;
				anst[i+j-1]%=10;
			}
			anst[i+cnt2]=temp;
		}
		while(anst[cntans]==0&&cntans>0) cntans--;
		if(cntans==0) cntans=1,ansf=1;
		for(int i=1;i<=cntans;i++) ans[i]=anst[i];
		cnt=cntans;f=ansf;return;
	}
	inline void operator += (Num b){
		if (f < 0 && b.f>0) minus(b.num, b.cnt, num, cnt, num, cnt, f);
		else if (f > 0 && b.f < 0) minus(num, cnt, b.num, b.cnt, num, cnt, f);
		else {add(num, cnt, b.num, b.cnt, num, cnt); }
	}
	inline void operator -= (Num b){
		if (b.f < 0 && f>0) { f = 1; add(num, cnt, b.num, b.cnt, num, cnt); }
		else if (f < 0 && b.f>0) { f = -1; add(num, cnt, b.num, b.cnt, num, cnt); }
		else if (f > 0 && b.f > 0) minus(num, cnt, b.num, b.cnt, num, cnt, f);
		else if (f < 0 && b.f < 0) minus(b.num, b.cnt, num, cnt, num, cnt, f);
	}
	inline Num operator + (Num b){
		Num c;if (f < 0 && b.f>0) minus(b.num, b.cnt, num, cnt, c.num, c.cnt, c.f);
		else if (f > 0 && b.f < 0) minus(num, cnt, b.num, b.cnt, c.num, c.cnt, c.f);
		else {add(num, cnt, b.num, b.cnt, c.num, c.cnt); }return c;
	}
	inline Num operator - (Num b){
		Num c;if (b.f < 0 && f>0) { f = 1; add(num, cnt, b.num, b.cnt, c.num, c.cnt); }
		else if (f < 0 && b.f>0) { f = -1; add(num, cnt, b.num, b.cnt, c.num, c.cnt); }
		else if (f > 0 && b.f > 0) minus(num, cnt, b.num, b.cnt, c.num, c.cnt, c.f);
		else if (f < 0 && b.f < 0) minus(b.num, b.cnt, num, cnt, c.num, c.cnt, c.f);
		return c;
	}
	inline void operator = (Num b){copy(b.num,b.cnt,b.f,num,cnt,f);}
	template<typename T>inline void operator = (T b){copynum(num,cnt,f,b);}
	inline void operator ++ (){
		Num c;c=1;
		if (f < 0 && c.f>0) minus(c.num, c.cnt, num, cnt, num, cnt, f);
		else if (f > 0 && c.f < 0) minus(num, cnt, c.num, c.cnt, num, cnt, f);
		else {add(num, cnt, c.num, c.cnt, num, cnt); }
	}
	inline void operator -- (){
		Num c;c=-1;
		if (f < 0 && c.f>0) minus(c.num, c.cnt, num, cnt, num, cnt, f);
		else if (f > 0 && c.f < 0) minus(num, cnt, c.num, c.cnt, num, cnt, f);
		else {add(num, cnt, c.num, c.cnt, num, cnt); }
	}
	inline bool operator >= (Num b){return ismax(num,cnt,f,b.num,b.cnt,b.f);}
	template<typename T>inline bool operator >= (T b){
		Num c;c=b;return ismax(num,cnt,f,c.num,c.cnt,c.f);
	}
	inline bool operator <= (Num b){return ismin(num,cnt,f,b.num,b.cnt,b.f);}
	template<typename T>inline bool operator <= (T b){
		Num c;c=b;return ismin(num,cnt,f,c.num,c.cnt,c.f);
	}
	inline bool operator == (Num b){
		return ismax(num,cnt,f,b.num,b.cnt,b.f)&&ismin(num,cnt,f,b.num,b.cnt,b.f);
	}
	template<typename T>inline bool operator == (T b){
		Num c;c=b;
		return ismin(num,cnt,f,c.num,c.cnt,c.f)&&ismax(num,cnt,f,b.num,b.cnt,b.f);
	}
	inline bool operator > (Num b){return !ismin(num,cnt,f,b.num,b.cnt,b.f);}
	inline bool operator < (Num b){return !ismax(num,cnt,f,b.num,b.cnt,b.f);}
	template<typename T>inline bool operator > (T b){
		Num c;c=b;return !ismin(num,cnt,f,c.num,c.cnt,c.f);
	}
	template<typename T>inline bool operator < (T b){
		Num c;c=b;return !ismax(num,cnt,f,c.num,c.cnt,c.f);
	}
	inline Num operator * (Num b){
		Num c;
		multiply(num,cnt,f,b.num,b.cnt,b.f,c.num,c.cnt,c.f);
		return c;
	}
	inline void operator *= (Num b){multiply(num,cnt,f,b.num,b.cnt,b.f,num,cnt,f);}
};
inline int GetNum(Num a){return a.getnum(a.num,a.cnt,a.f);}
inline void read(Num &a){
	a.cnt=0;a.f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') a.f=-a.f;ch=getchar();}
	while(ch>='0'&&ch<='9'){a.num[++a.cnt]=ch-'0';ch=getchar();}
	for(int i=1;i<=a.cnt/2;i++) swap(a.num[i],a.num[a.cnt-i+1]);
}
inline void write(Num x){
	if(x.f<0) putchar('-');
	for(int i=x.cnt;i>=1;i--) 
		putchar(x.num[i]+'0');
	putchar('\n');return;
}
#define int Num
#define long long Num
#define __int128 Num
#define ui Num
#define ull Num

signed main(){
	int a,b;
	read(a),read(b);
	if(a<=b) printf("<=");
	else printf(">");
} 

posted @   UncleSam_Died  阅读(23)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示