首页 > 其他分享 >高精度模板2--zhengjun

高精度模板2--zhengjun

时间:2023-03-08 12:56:45浏览次数:27  
标签:return -- ll zhengjun int bign operator const 模板

只支持非负数,用 vectoer 实现。

#include<bits/stdc++.h>
using namespace std;
using ll=unsigned long long;
using bigint=unsigned long long;
using bigbig=__int128;
struct bign{
	static const int block=14;
	static const ll base=pow(10,block);
	vector<ll>a;
	bign(ll x=0){
		for(;x;x/=base)a.push_back(x%base);
	}
	bign(string s){
		reverse(s.begin(),s.end());
		for(int i=0;i<(int)s.length();i+=block){
			int r=min((int)s.length(),i+block),x=0;
			for(int j=r-1;j>=i;j--)x=x*10+s[j]-48;
			a.push_back(x);
		}
	}
	bign operator = (ll x){
		return *this=bign(x);
	}
	bign operator = (string s){
		return *this=bign(s);
	}
	void resize(int len){
		a.assign(len,0);
	}
	ll operator [] (const int &x)const{
		return a[x];
	}
	ll& operator [] (const int &x){
		return a[x];
	}
	friend istream& operator >> (istream& in,bign &x){
		string s;
		in>>s,x=s;
		return in;
	}
	friend ostream& operator << (ostream& out,const bign &x){
		if(x.a.empty())out<<"0";
		else{
			ll ed=x.a.back();
			printf("%llu",ed);
			for(int i=x.a.size()-2;~i;i--)printf("%0*llu",block,x[i]);
		}
		return out;
	}
	bool operator < (const bign &x)const{
		if(a.size()!=x.a.size())return a.size()<x.a.size();
		for(int i=a.size()-1;~i;i--)if(a[i]^x[i])return a[i]<x[i];
		return 0;
	}
	bool operator == (const bign &x)const{
		if(a.size()!=x.a.size())return 0;
		for(int i=0;i<(int)a.size();i++)if(a[i]^x[i])return 0;
		return 1;
	}
	bool operator != (const bign &x)const{
		return !(*this==x);
	}
	bool operator > (const bign &x)const{
		return x<*this;
	}
	bool operator <= (const bign &x)const{
		if(a.size()!=x.a.size())return a.size()<x.a.size();
		for(int i=a.size()-1;~i;i--)if(a[i]^x[i])return a[i]<x[i];
		return 1;
	}
	bool operator >= (const bign &x)const{
		return x<=*this;
	}
	bign operator += (const bign &x){
		ll r=0;
		for(int i=0;i<(int)x.a.size()||r;i++){
			if(i<(int)x.a.size())r+=x[i];
			if(i>=(int)a.size())a.push_back(0);
			if((a[i]+=r)>=base)r=1,a[i]-=base;
			else r=0;
		}
		return *this;
	}
	bign operator + (const bign &x)const{
		bign t=*this;
		return t+=x;
	}
	bign operator -= (const bign &x){
		ll r=0;
		for(int i=0;i<(int)x.a.size()||r;i++){
			if(i<(int)x.a.size())r+=x[i];
			if(a[i]>=r)a[i]-=r,r=0;
			else a[i]+=base-r,r=1;
		}
		for(;!a.empty()&&!a.back();)a.pop_back();
		return *this;
	}
	bign operator - (const bign &x)const{
		bign t=*this;
		return t-=x;
	}
	bign operator -= (const ll &_x){
		ll r=0;
		ll x=_x;
		for(int i=0;x||r;i++){
			r+=x%base,x/=base;
			if(a[i]>=r)a[i]-=r,r=0;
			else a[i]+=base-r,r=1;
		}
		for(;!a.empty()&&!a.back();)a.pop_back();
		return *this;
	}
	bign operator - (const ll &x)const{
		bign t=*this;
		return t-=x;
	}
	bign operator * (const bign &x)const{
		int len=a.size()+x.a.size()+1;
		vector<bigbig>t(a.size()+x.a.size()+1);
		for(int i=0;i<(int)a.size();i++)for(int j=0;j<(int)x.a.size();j++){
			int k=i+j;
			t[k]+=(bigbig)a[i]*x[j],t[k+1]+=t[k]/base,t[k]%=base;
		}
		bign ans;
		ans.resize(len);
		for(int i=0;i<(int)t.size();i++){
			if(i+1<(int)t.size())t[i+1]+=t[i]/base;
			ans[i]=t[i]%base;
		}
		for(;!ans.a.empty()&&!ans.a.back();)ans.a.pop_back();
		return ans;
	}
	bign operator *= (const bign &x){
		return *this=*this*x;
	}
	bign operator *= (const int &x){
		bigint r=0;
		for(int i=0;i<(int)a.size()||r;i++){
			if(i>=(int)a.size())a.push_back(0);
			r+=x*(bigint)a[i],a[i]=r%base,r/=base;
		}
		return *this;
	}
	bign operator * (const int &x)const{
		bign t=*this;
		return t*=x;
	}
	bign operator *= (const ll &x){
		bigint r=0;
		for(int i=0;i<(int)a.size()||r;i++){
			if(i>=(int)a.size())a.push_back(0);
			r+=x*(bigint)a[i],a[i]=r%base,r/=base;
		}
		return *this;
	}
	bign operator * (const ll &x)const{
		bign t=*this;
		return t*=x;
	}
	bign operator /= (const ll &x){
		bigint r=0;
		for(int i=a.size()-1;~i;i--){
			r=r*base+a[i];
			a[i]=r/x,r%=x;
		}
		for(;!a.empty()&&!a.back();)a.pop_back();
		return *this;
	}
	bign operator / (const ll &x)const{
		bign t=*this;
		return t/=x;
	}
	friend bign qpow(const bign &_x,const ll &_y){
		bign x(_x),ans(1);
		for(ll y=_y;y;y>>=1,x*=x)if(y&1)ans*=x;
		return ans;
	}
	ll trans()const{
		ll x=0;
		for(int i=a.size()-1;~i;i--)x=x*base+a[i];
		return x;
	}
};
int main(){
	return 0;
}

标签:return,--,ll,zhengjun,int,bign,operator,const,模板
From: https://www.cnblogs.com/A-zjzj/p/17191659.html

相关文章

  • 79.单词搜索
    单词搜索给定一个 mxn二维字符网格 board和一个字符串单词 word。如果 word存在于网格中,返回true;否则,返回false。单词必须按照字母顺序,通过相邻的单元格内......
  • [java]-超时自动处理
    实现方式1.数据库轮询(30)订单表(订单ID、状态、创建时间)物理、逻辑2.JDK队列DelayedQueue无界阻塞队列​poll()得到超时的元素,如果没有任何元素超时,......
  • [java基础]-反射
    (一)反射:框架设计的灵魂1.反射介绍*框架:半成品软件。可以在框架的基础上进行软件开发,简化编码*反射:将类的各个组成部分封装为其他对象,这就是反射机制 *好处: 1.可以......
  • [java高级]-Stream API说明
    1、StreamAPI说明Java8中有两大最为重要的改变。第一个是Lambda表达式;另外一个则是StreamAPI。StreamAPI(java.util.stream)把真正的函数式编程风格引入到......
  • js 简单的深拷贝
    本题是通过@郝晨光 的文章受到的启发,学习来的,大家有兴趣可以看一下,而且我觉得这种写法非常通俗易懂,工作中也足够去使用了。functionDeepClone(target){letresult......
  • 多线程的interrut()方法
    java中的interrut方法,主要作用为中断指定线程,该中断并非是直接打断,而是将线程的中断标志设置为1,当线程执行到sleep、wait方法陷入的阻塞状态,则进行中断,抛出interrutExcepti......
  • [java高级]-详解Java8 Collect收集Stream的方法
    1、Collection,Collections,collect,Collector,CollectosCollection是Java集合的祖先接口。Collections是java.util包下的一个工具类,内涵各种处理集合的静态方法。j......
  • [java高级]-强大的Stream API
    1、StreamAPI说明Java8中有两大最为重要的改变。第一个是Lambda表达式;另外一个则是StreamAPI。StreamAPI(java.util.stream)把真正的函数式编程风格引入到......
  • LeetCode 105. 从前序与中序遍历序列构造二叉树
    原题解题目约束题解解法一classSolution{private:unordered_map<int,int>index;public:TreeNode*myBuildTree(constvector<int>&preorder......
  • ###安全运营的定义与核心目标
    转载公众号《微言晓意》,仅用于个人学习1、安全运营当下越来越流行的背景:安全运营变得越来越重要的原因,或者说是越来越需要安全运营的背景,主要包括四个方面:1)安全项目实施......