首页 > 其他分享 >高精模板

高精模板

时间:2023-01-20 13:13:24浏览次数:47  
标签:return int Big dig while num 高精 模板

#include <algorithm>
using std::min;
using std::max;
typedef unsigned long long ull;
typedef long long ll;
constexpr ull BASE = 100000000;
constexpr unsigned LEN = 10000/8 +5;
struct Big{
	ull num[LEN];
	int dig=0;
	void read(){
		char ch[LEN*8];
		int siz = 0;
		char c = getchar();
		while(c=='\n' || c=='\r') c=getchar();
		while(!(c=='\n' || c=='\r' || c==EOF)){
			ch[siz++] = c-'0';
			c = getchar();
		}
		--siz;
		int base = 1, now = 0;
		for(int i=0; i<=siz; ++i){
			now += ch[siz-i] * base;
			base *= 10;
			if(base == BASE){
				base = 1;
				num[dig++] = now;
				now = 0;
			}
		}
		num[dig++] = now;
	}
	void outp(){
		if(!dig) return;
		int i=dig-1;
		printf("%llu", num[dig-1]);
		if(i) do{
			--i;
			printf("%08llu", num[i]);
		} while(i);
	}
	void cary(){
		ull carry = 0;
		for(int i=0; i<dig; ++i){
			num[i] += carry;
			carry = num[i] / BASE;
			num[i] %= BASE;
		}
		while(carry){
			num[dig++] = carry%BASE;
			carry /= BASE;
		}
	}
	Big& operator+=(Big b){
		dig = max(dig, b.dig);
		for(int i=0; i<dig; ++i){
			num[i] += b.num[i];
		}
		this->cary();
		return *this;
	}
	bool operator<(Big b){
		if(dig == b.dig){
			for(int i=dig; i>=0; --i)
				if(num[i] != b.num[i]) return num[i] < b.num[i];
		}
		else return dig<b.dig;
		return false;
	}
	bool operator==(Big b){
		if(dig != b.dig) return false;
		for(int i=0; i<dig; ++i){
			if(num[i] != b.num[i]) return false;
		}
		return true;
	}
	Big& operator-=(Big b){
		// ensure a > b
		bool carry = 0;
		int newdig = 0;
		int maxlen = max(dig, b.dig);
		for(int i=0; i<maxlen; ++i){
			num[i] += (BASE - b.num[i] - carry);
			if(num[i] >= BASE){
				num[i] -= BASE;
				carry = 0;
			} else carry = 1;
			if(num[i]) newdig = i;
		}
		dig = newdig+1;
		return *this;
	}
	Big& half(){
		if(!dig) return *this;
		num[0] >>= 1;
		for(int i=1; i<dig; ++i){
			num[i-1] += ((num[i]&1)*BASE)>>1;
			num[i] >>= 1;
		}
		if(!num[dig-1]) dig--;
		return *this;
	}
	Big& operator<<=(unsigned times){
		// << 37 : inside ull
		constexpr int MOST = 37;
		while(times>MOST){
			*this <<= MOST;
			times -= MOST;
		}
		for(int i=0; i<dig; ++i){
			num[i] <<= times;
		}
		this->cary();
		return *this;
	}
	bool iseven(){
		return !(num[0]&1);
	}
};
Big gcd(Big a, Big b){
	int at=0, bt=0;
	while(a.iseven()) a.half(), ++at;
	while(b.iseven()) b.half(), ++bt;
	for(;;){
		while(a.iseven()) a.half();
		while(b.iseven()) b.half();
		if(a==b) break;
		if(a<b) std::swap(a, b);
		a-=b;
	}
	return a <<= min(at, bt);
}

标签:return,int,Big,dig,while,num,高精,模板
From: https://www.cnblogs.com/x383494/p/17062676.html

相关文章

  • 07-模板模式
    07-模板模式概念模板模式是一种常见的设计模式,在实现中经常可以看到,具体的使用场景为:整体流程大致相同,其中有部分方法实现不同。例子本文给出《大话设计模式》书中的例......
  • vue项目中components组件(模板)的使用和传值
    在项目开发过程中,我们经常会遇到重复代码结构,比如页面的头部、底部等,通常我们都是作为模板或者公共文件进行设计使用,在vue中,我们可以使用components组件(模板)来实现。下面我......
  • 高精度四则运算
    算法学习的第三天算法学习之高精度四则运算高精度算法(HighAccuracyAlgorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然......
  • c++基础篇之C++ 模板
    C++模板模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都......
  • [简单DP+高精度]围墙重建
    题目描述为了给同学们营造一个良好的学习环境和方便学校的管理,市政府准备对小W就读的学校进行重新规划,占地面积将再次扩大。学校通过领导会议决定,重建学校的围墙。由......
  • 【转载】回复“大修意见”(Major Revision)的模板 —— 审稿意见回复模板
    原文地址:https://zhuanlan.zhihu.com/p/80214252  ==================================================   上周有个小伙伴问有没有大修意见(MajorRevision)的......
  • 设计模式之模板方法模式和策略模式
    今天看了雷神的公开课,再次学习了设计模式的五个原则以及两个设计模式的应用案例模板方法模式:定义一个算法骨架(一套业务流程),子类可以实现里面的一个或多个步骤eg:对于Spr......
  • 第五章:模板层
    模板层模板语法传值{{}}:传变量相关的值,如:整型、列表、字典、函数等等{%%}:传逻辑相关的值,如:for循环、if判断、static动态解析等等传递基本数据类型整型、浮点型、......
  • C#-使用模板导出Word文件
    记录下使用C#+Word模板导出Word文件的方法。首先建立Word文件模板,需要填写的地方用占位符替代,比如姓名处:name,年龄处:age....首先引入命名空间:usingword=Microsoft......
  • C++ 可变参模板
    求多个数的最小值template<typenameT,typename...Ts>constexprautomin(constT&a,constT&b,constTs&...ts){constautom=a<b?a:b;ifco......