首页 > 其他分享 >__int1024!

__int1024!

时间:2024-06-18 12:21:09浏览次数:7  
标签:__ return int1024 zp rn qm

使用说明:

  1. 数据范围约为\(-2^{1024}\le N \le2^{1024}\),反映到十进制约为\(-10^{309}\le N \le10^{309}\),但不保证完全如此。
  2. 输入输出使用自带的输入及输出函数。由于其内部用scanfprintf来实现,所以请不要把它与ios::sync_with_stdio(false)同时使用。
  3. 由于内部采用高精度实现,所以复杂度不可忽略。具体复杂度会在下面列出。
  4. 特别地,自增及自减运算只能放在变量前面。如置于后面会报错。
    支持操作:
  5. 输入输出。使用.in().out()即可。
  6. 运算。支持+-*/%``++``--共七种运算,类比int使用即可。
  7. 赋值。直接使用=即可。
  8. 比较关系。支持>>=<<===!=共六种运算,类比int使用即可。
    头文件&宏定义:
    宏定义不喜可换。
#include<iostream>
#include<string.h>
using namespace std;
#define il inline
#define ri register int

正片:
因为本来就没想让别人读懂所以一点注释都没加。

struct __int1024
{
	string zp;
	il void out()
	{
		int h=0;
		if(zp[h]=='-')
		{
			printf("%c",zp[h]);
			h++;
		}
		while(zp[h]>='0'&&zp[h]<='9')
		{
			printf("%c",zp[h]);
			h++;
		}
		return;
	}
	il void in()
	{
		char c=' ';
		while(scanf("%c",&c)!=EOF)
		{
			if(c=='+'||c=='-')
			{
				break;
			}
			if(c>='0'&&c<='9')
			{
				break;
			}
		}
		if(c=='-')
		{
			zp.push_back(c);
		}
		if(c>='0'&&c<='9')
		{
			zp.push_back(c);
		}
		while(scanf("%c",&c)!=EOF)
		{
			if(c=='+')
			{
				continue;
			}
			if(c=='-')
			{
				zp.push_back(c);
				continue;
			}
			if(c>='0'&&c<='9')
			{
				zp.push_back(c);
				continue;
			}
			break;
		}
		return;
	}
	il bool dayu(__int1024 x,__int1024 y)
	{
		if(x.zp[0]=='-'&&y.zp[0]=='-')
		{
			__int1024 m,n;
			int u=x.zp.size(),v=x.zp.size();
			m.zp=x.zp.substr(1,u-1);
			n.zp=y.zp.substr(1,v-1);
			return dayu(n,m);
		}
		if(x.zp[0]=='-')
		{
			return false;
		}
		if(y.zp[0]=='-')
		{
			return true;
		}
		if(x.zp.size()>y.zp.size())
		{
			return true;
		}
		if(x.zp.size()<y.zp.size())
		{
			return false;
		}
		for(ri i=0;i<x.zp.size();i++)
		{
			if(x.zp[i]>y.zp[i])
			{
				return true;
			}
			if(x.zp[i]<y.zp[i])
			{
				return false;
			}
		}
		return false;
	}
	il bool xiaoyu(__int1024 x,__int1024 y)
	{
		if(x.zp[0]=='-'&&y.zp[0]=='-')
		{
			__int1024 m,n;
			int u=x.zp.size(),v=x.zp.size();
			m.zp=x.zp.substr(1,u-1);
			n.zp=y.zp.substr(1,v-1);
			return xiaoyu(n,m);
		}
		if(x.zp[0]=='-')
		{
			return true;
		}
		if(y.zp[0]=='-')
		{
			return false;
		}
		if(x.zp.size()<y.zp.size())
		{
			return true;
		}
		if(x.zp.size()>y.zp.size())
		{
			return false;
		}
		for(ri i=0;i<x.zp.size();i++)
		{
			if(x.zp[i]<y.zp[i])
			{
				return true;
			}
			if(x.zp[i]>y.zp[i])
			{
				return false;
			}
		}
		return false;
	}
	il bool dengyu(__int1024 x,__int1024 y)
	{
		if(x.zp.size()!=y.zp.size())
		{
			return false;
		}
		for(ri i=0;i<x.zp.size();i++)
		{
			if(x.zp[i]!=y.zp[i])
			{
				return false;
			}
		}
		return true;
	}
	il __int1024 jia(__int1024 x,__int1024 y)
	{
		string rn;
		__int1024 qm;
		int u=x.zp.size(),v=y.zp.size(),w;
		if(x.zp[0]=='-'&&y.zp[0]=='-')
		{
			__int1024 m,n,z;
			m.zp=x.zp.substr(1,u-1);
			n.zp=y.zp.substr(1,v-1);
			z=jia(m,n);
			if(z.zp[0]=='-')
			{
				rn=z.zp.substr(1,z.zp.size()-1);
			}
			else
			{
				rn.resize(1,'-');
				rn+=z.zp;
			}
			qm.zp=rn;
			return qm;
		}
		if(x.zp[0]=='-')
		{
			__int1024 z;
			z.zp=x.zp.substr(1,u-1);
			return jian(y,z);
		}
		if(y.zp[0]=='-')
		{
			__int1024 z;
			z.zp=y.zp.substr(1,v-1);
			return jian(x,z); 
		}
		int o[310],p[310],q[310];
		memset(o,0,sizeof(o));
		memset(p,0,sizeof(p));
		memset(q,0,sizeof(q));
		for(ri i=0,j=u;j>0;i++,j--)
		{
			p[j]=x.zp[i]-'0';
		}
		for(ri i=0,j=v;j>0;i++,j--)
		{
			q[j]=y.zp[i]-'0';
		}
		w=max(u,v);
		for(ri i=1;i<=w+1;i++)
		{
			int j=p[i]+q[i];
			o[i]+=j;
			o[i+1]+=o[i]/10;
			o[i]%=10;
		}
		if(o[w+1]!=0)
		{
			w++;
		}
		rn.resize(w,'0');
		for(ri i=0,j=w;j>0;i++,j--)
		{
			rn[i]+=o[j];
		}
		qm.zp=rn;
		return qm;
	}
	il __int1024 jian(__int1024 x,__int1024 y)
	{
		__int1024 qm;
		string rn;
		int u=x.zp.size(),v=y.zp.size(),w;
		if(x.zp[0]=='-'&&y.zp[0]=='-')
		{
			__int1024 m,n,z;
			m.zp=x.zp.substr(1,u-1);
			n.zp=y.zp.substr(1,v-1);
			z=jian(m,n);
			w=z.zp.size();
			if(z.zp[0]=='-')
			{
				rn=z.zp.substr(1,w-1);
			}
			else
			{
				rn.resize(1,'-');
				rn+=z.zp;
			}
			qm.zp=rn;
			return qm;
		}
		if(y.zp[0]=='-')
		{
			__int1024 z;
			z.zp=y.zp.substr(1,v-1);
			return jia(x,z);
		}
		if(x.zp[0]=='-')
		{
			__int1024 z,t;
			z.zp=x.zp.substr(1,u-1);
			t=jia(z,y);
			qm.zp.resize(1,'-');
			qm.zp+=t.zp;
			return qm;
		}
		if(dayu(x,y)==false&&dengyu(x,y)==false)
		{
			__int1024 m,n,z;
			m.zp=x.zp;
			n.zp=y.zp;
			z=jian(n,m);
			w=z.zp.size();
			if(z.zp[0]=='-')
			{
				rn=z.zp.substr(1,w-1);
			}
			else
			{
				rn.resize(1,'-');
				rn+=z.zp;
			}
			qm.zp=rn;
			return qm;
		}
		int o[310],p[310],q[310];
		memset(o,0,sizeof(o));
		memset(p,0,sizeof(p));
		memset(q,0,sizeof(q));
		for(ri i=0,j=u;j>0;i++,j--)
		{
			p[j]=x.zp[i]-'0';
		}
		for(ri i=0,j=v;j>0;i++,j--)
		{
			q[j]=y.zp[i]-'0';
		}
		for(ri i=1;i<=u;i++)
		{
			int j=p[i]-q[i];
			o[i]+=j;
			o[i+1]+=o[i]/10;
			o[i]%=10;
			if(o[i]<0)
			{
				o[i]+=10;
				o[i+1]-=1;
			}
		}
		while(o[u]==0&&u!=1)
		{
			u--;
		}
		rn.resize(u,'0');
		for(ri i=0,j=u;j>0;i++,j--)
		{
			rn[i]+=o[j];
		}
		qm.zp=rn;
		return qm;
	}
	il __int1024 cheng(__int1024 x,__int1024 y)
	{
		string rn;
		__int1024 qm;
		int u=x.zp.size(),v=y.zp.size(),w;
		if(x.zp[0]=='-'&&y.zp[0]=='-')
		{
			__int1024 m,n;
			m.zp=x.zp.substr(1,u-1);
			n.zp=y.zp.substr(1,v-1);
			return cheng(m,n);
		}
		if(x.zp[0]=='-'||y.zp[0]=='-')
		{
			__int1024 m,n,z;
			m.zp=x.zp.substr(1,u-1);
			n.zp=y.zp.substr(1,v-1);
			z=cheng(m,n);
			if(z.zp[0]=='-')
			{
				rn=z.zp.substr(1,z.zp.size()-1);
			}
			else
			{
				rn.resize(1,'-');
				rn+=z.zp;
			}
			qm.zp=rn;
			return qm;
		}
		int o[310],p[310],q[310];
		memset(o,0,sizeof(o));
		memset(p,0,sizeof(p));
		memset(q,0,sizeof(q));
		for(ri i=0,j=u;j>0;i++,j--)
		{
			p[j]=x.zp[i]-'0';
		}
		for(ri i=0,j=v;j>0;i++,j--)
		{
			q[j]=y.zp[i]-'0';
		}
		w=u+v;
		for(ri i=1;i<=u;i++)
		{
			for(ri j=1;j<=v;j++)
			{
				int k=p[i]*q[j];
				o[i+j-1]+=k;
				o[i+j]+=o[i+j-1]/10;
				o[i+j-1]%=10;
			}
		}
		while(o[w]==0&&w!=1)
		{
			w--;
		}
		rn.resize(w,'0');
		for(ri i=0,j=w;j>0;i++,j--)
		{
			rn[i]+=o[j];
		}
		qm.zp=rn;
		return qm;
	}
	il __int1024 chu(__int1024 x,__int1024 y)
	{
		string rn;
		__int1024 qm;
		int u=x.zp.size(),v=y.zp.size();
		if(x.zp[0]=='-'&&y.zp[0]=='-')
		{
			__int1024 m,n;
			m.zp=x.zp.substr(1,u-1);
			n.zp=y.zp.substr(1,v-1);
			return chu(m,n);
		}
		if(x.zp[0]=='-')
		{
			__int1024 m,z;
			m.zp=x.zp.substr(1,u-1);
			z=chu(m,y);
			if(z.zp[0]=='-')
			{
				rn=z.zp.substr(1,z.zp.size()-1);
			}
			else
			{
				rn.resize(1,'-');
				rn+=z.zp;
			}
			qm.zp=rn;
			return qm;
		}
		if(y.zp[0]=='-')
		{
			__int1024 n,z;
			n.zp=y.zp.substr(1,v-1);
			z=chu(x,n);
			if(z.zp[0]=='-')
			{
				rn=z.zp.substr(1,z.zp.size()-1);
			}
			else
			{
				rn.resize(1,'-');
				rn+=z.zp;
			}
			qm.zp=rn;
			return qm;
		}
		if(dayu(x,y)==false&&dengyu(x,y)==false)
		{
			qm.zp="0";
			return qm;
		}
		int o[310],p[310],q[310];
		memset(o,0,sizeof(o));
		memset(p,0,sizeof(p));
		memset(q,0,sizeof(q));
		for(ri i=0;i<u;i++)
		{
			p[i+1]=x.zp[i]-'0';
		}
		for(ri i=0;i<u;i++)
		{
			q[i+1]=y.zp[i]-'0';
		}
		int rt=1;
		for(ri i=1;i<=u;i++)
		{
			if(rt>i)
			{
				o[i]=0;
				continue;
			}
			string al=x.zp.substr(0,i-rt+1);
			__int1024 z;
			z.zp=al;
			if(dayu(y,z)==true)
			{
				o[i]=0;
				continue;
			}
			int m=1,n=9;
			while(n-m>1)
			{
				char l=((m+n)>>1)+'0';
				__int1024 wn;
				wn.zp.push_back(l);
				if(dayu(cheng(y,wn),z)==true)
				{
					n=l-'0'-1;
				}
				else
				{
					m=l-'0';
				}
			}
			char l=n+'0';
			__int1024 wn,xo;
			wn.zp.push_back(l);
			if(dayu(cheng(y,wn),z)==false)
			{
				o[i]=n;
				wn.zp[0]=n+'0';
				xo=cheng(wn,y);
				for(ri j=i+1;j<=u;j++)
				{
					xo.zp.push_back('0');
				}
				int sk=x.zp.size();
				x=jian(x,xo);
				rt+=sk-x.zp.size();
			}
			else
			{
				o[i]=m;
				wn.zp[0]=m+'0';
				xo=cheng(wn,y);
				for(ri j=i+1;j<=u;j++)
				{
					xo.zp.push_back('0');
				}
				int sk=x.zp.size();
				x=jian(x,xo);
				rt+=sk-x.zp.size();
			}
		}
		int w=1;
		while(o[w]==0&&w!=u)
		{
			w++;
		}
		rn.resize(u-w+1,'0');
		for(ri i=0,j=w;j<=u;i++,j++)
		{
			rn[i]+=o[j];
		}
		qm.zp=rn;
		return qm;
	}
	__int1024 zjia(__int1024 x)
	{
		string rn;
		if(x.zp[0]=='-')
		{
			__int1024 y,z;
			y.zp=x.zp.substr(1,x.zp.size());
			z=zjian(y);
			if(z.zp[0]!='0')
			{
				rn=z.zp;
				z.zp='-';
				z.zp+=rn;
			}
			return z;
		}
		int h=x.zp.size()-1;
		while(x.zp[h]=='9'&&h>=0)
		{
			x.zp[h]='0';
			h--;
		}
		if(h<0)
		{
			rn=x.zp;
			x.zp='1';
			x.zp+=rn;
		}
		else
		{
			x.zp[h]+=1;
		}
		return x;
	}
	__int1024 zjian(__int1024 x)
	{
		string rn;
		if(x.zp[0]=='0')
		{
			x.zp="-1";
			return x;
		}
		if(x.zp[0]=='-')
		{
			__int1024 y,z;
			y.zp=x.zp.substr(1,x.zp.size());
			z=zjia(y);
			if(z.zp[0]!='0')
			{
				rn=z.zp;
				z.zp='-';
				z.zp+=rn;
			}
			return z;
		}
		int h=x.zp.size()-1;
		while(x.zp[h]=='0'&&h>=0)
		{
			x.zp[h]='9';
			h--;
		}
		if(h<0)
		{
			rn=x.zp.substr(1,x.zp.size()-1);
			x.zp+=rn;
		}
		else
		{
			x.zp[h]-=1;
		}
		return x;
	}
	__int1024 operator +(const __int1024 &A)
	{
		return jia(*this,A);
	}
	__int1024 operator -(const __int1024 &A)
	{
		return jian(*this,A);
	}
	__int1024 operator*(const __int1024 &A)
	{
		return cheng(*this,A);
	}
	__int1024 operator/(const __int1024 &A)
	{
		return chu(*this,A);
	}
	__int1024 operator%(const __int1024 &A)
	{
		return jian(*this,cheng(A,chu(*this,A)));
	}
	void operator++()
	{
		*this=zjia(*this);
	}
	void operator--()
	{
		*this=zjian(*this);
	}
	void operator =(const __int1024 &A)
	{
		zp=A.zp;
		return;
	}
	bool operator >(const __int1024 &A)
	{
		return dayu(*this,A);
	}
	bool operator <(const __int1024 &A)
	{
		return xiaoyu(*this,A);
	}
	bool operator ==(const __int1024 &A)
	{
		return dengyu(*this,A);
	}
	bool operator >=(const __int1024 &A)
	{
		return (dayu(*this,A)||dengyu(*this,A));
	}
	bool operator <=(const __int1024 &A)
	{
		return (xiaoyu(*this,A)||dengyu(*this,A));
	}
	bool operator !=(const __int1024 &A)
	{
		return (dengyu(*this,A)==true)?false:true;
	}
};

后记:
想学高精建议打P1932
__int65536正加紧制作中!

标签:__,return,int1024,zp,rn,qm
From: https://www.cnblogs.com/ywhhdjser-97/p/18254100

相关文章

  • 1602:烽火传递
    //1602:烽火传递.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。//#include<iostream>#include<cstring>usingnamespacestd;/**https://loj.ac/p/10180http://ybt.ssoier.cn:8088/problem_show.php?pid=1602原题来自:NOIP2010提高组初赛·完善程......
  • springboot引入第三方jar包本地lib并打包
    springboot引入第三方jar包本地lib并打包亲测可用一、在项目根目录创建lib目录并放入第三方lib包--project----lib(放在这儿)----src----target二、pom中引入第三方lib<!--自定义引入jar--><dependency><groupId>commons-io</groupId><artifac......
  • JQuery基础28_入门1
    一、概念一个JavaScript框架。简化JS开发jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨 是“writeLess,DoMore”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便......
  • linux 配置java环境变量
    1.下载与安装查看操作系统位数uname-m如果输出是x86_64,那么你的系统是64位的;如果输出是i686或i386,那么你的系统是32位的。openJDK下载地址:清华大学开源软件镜像站以jdk11为例,下载地址为:https://mirror.tuna.tsinghua.edu.cn/Adoptium/11/jdk/x64/linux/OpenJDK11U-jdk_x......
  • 135. 最大子序和
    //135.最大子序和dp.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。//#include<iostream>#include<deque>usingnamespacestd;/*https://www.acwing.com/problem/content/137/输入一个长度为n的整数序列,从中找出一段长度不超过m的连续子序列......
  • mysql数据库名带下划线等特殊字符时,分权限报错
    原文链接:mysql数据库名带下划线分权限报错_mob64ca12f24f3a的技术博客_51CTO博客 MySQL数据库名带下划线分权限报错解析在使用MySQL进行数据库操作时,我们经常会遇到数据库名带下划线导致权限报错的情况。这是因为MySQL对于数据库名中的下划线有特殊的处理机制,容易导致权限控制......
  • 第13章:泛型
    第13章:随堂复习与企业真题(泛型)一、随堂复习1.泛型的理解,泛型参数,使用引用数据类型来赋值。2.泛型在集合、比较器中的使用(重点)集合:ArrayList、HashMap、Iterator比较器:Comparable、Comparator3.自定义泛型类/泛型接口、泛型方法(熟悉)classOrder{}public返回值......
  • 网络安全管理是一个系统化的过程,旨在保护网络系统及数据免受未经授权的访问和各类网络
    网络安全管理是一个系统化的过程,旨在保护网络系统及数据免受未经授权的访问和各类网络攻击。其工作原理主要包括以下几个方面:预防措施:通过安全配置管理和需求分析确定潜在的安全威胁,并制定相应的预防策略。这包括对网络设备和软件进行严格的安全配置以及定期更新,确保系统......
  • 分数限制下,选好专业还是选好学校?
    在分数限制的情况下,选择专业往往比选择学校更为关键。这是因为专业更直接影响到个人的兴趣和职业发展方向。考生应该基于个人的兴趣、职业规划和长远目标来决定,例如,如果对某个领域有热情,那么优先选择相关的专业,即使这意味着可能去一所排名稍低的学校。这样做的理由是,一个好......
  • ANSYS有限元网格划分的基本原则
    一、引言ANSYS有限元网格划分是进行数值模拟分析至关重要的一步,它直接影响着后续数值计算分析结果的精确性。网格划分涉及单元的形状及其拓扑类型、单元类型、网格生成器的选择、网格的密度、单元的编号以及几何体素。从几何表达上讲,梁和杆是相同的,从物理和数值求解上讲则是......