手写int128,重载运算符,函数

        今天做了一个题,需要用到高精度,但是数据范围在2^128以内,所以就想到手写模拟int128,之后重载运算符和函数,真的嘎嘎爽;

        那么我先介绍一下int128吧,大家都知道int是4个字节,long long是八个字节,当数据大过10^18以后就要用到高精度了,在数据并不是太大,而是在2^128以内的时候就可以用到int128了;

int128的定义

struct int128{
	long long hig;//储存高位
    long long low;//储存低位
};

        看到这个格式以后大家应该就已经明白了int128的用法了所以我补充一下重载运算符的操作;

运算符的重载

        大家直到常见的运算符(+、-、*、/),我们可以对他重载以达到我们想要的结果。

比如:

        +的重载

int128 operator + (int128 a,int128 b){
	int128 t;
	t.low=t.hig=0;
    //对高低位初始化 init
	t.low=a.low+b.low;
    //低位运算
	t.hig=t.low/mod+a.hig+b.hig;
    //高位运算,注意进位,mod==1e18
	t.low=t.low%mod;
    //对低位取余;
	return t;
}//重载+

        -的重载

int128 operator - (int128 a,int128 b){
	int128 t;
	t.low=t.hig=0;
    //init
	t.low=a.low-b.low;
    if(t.low<0){
        t.hig--;
        t.low=mod+t.low;
    }
	t.hig=t.hig+a.hig-b.hig;
	return t;
}//重载-

        *的重载

int128 operator * (int128 a,int128 b){
	int128 k;
	k.hig=k.low=0;
	k.low=a.low*b.low;
	k.hig=(k.hig+k.low/mod+(a.hig*b.low)%mod+(a.low*b.hig)%mod)%mod;
    //a.hig*b.hig一定会溢出
	k.low=k.low%mod;
	return k;
}//重载*

函数的使用

        我们可以利用int128重写函数swap、max等函数达到想要的效果

如max()

int128 tmax(int128 a,int128 b){
	if(a.hig==b.hig) 
		return (a.low>=b.low)?a:b;
	return (a.hig>b.hig)?a:b;
}

min()

int128 tmin(int128 a,int128 b){
	if(a.hig==b.hig) 
		return (a.low<=b.low)?a:b;
	return (a.hig

当然以相同的原理也可以弄一个Int256,int1024,用起来比高精度快而且写起来比较顺手

 

你可能感兴趣的:(c++)