使用说明:

  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正加紧制作中!

随机推荐

  1. DLF +DDI 一站式数据湖构建与分析最佳实践

    简介: 本文由阿里云数据湖构建 DLF 团队和 Databricks 数据洞察团队联合撰写,旨在帮助您更深入地了解阿里云数据湖构建(DLF)+Databricks 数据洞察(DDI)构建一站式云上数据 ...

  2. [LLM] 开源 AI 大语言模型的本地化定制实践

      LLM(Large Language Model,大型语言模型)是一种基于深度学习的自然语言处理模型,旨在理解和生成人类语言. 它们在大量的文本数据上进行训练,可以执行广泛的任务,包括文本总结.翻 ...

  3. dotnet 是否应该对 HttpResponseMessage 调用 Dispose 进行释放

    对于 HttpClient 的请求响应值 HttpResponseMessage 来说,既然继承了 IDisposable 接口,自然就是想让大家可以通过 using 或者手动调用 Dispose 进 ...

  4. WPF 已知问题 Separator 无法应用 ContextMenu 定义的默认样式

    本文记录一个 WPF 已知问题,在 ContextMenu 的 Resources 里定义 Separator 的默认样式,在 ContextMenu 里面的 Separator 将应用不上,或者说不 ...

  5. Oracle、达梦:同一数据库边查询边插入的两种方式

    1.方式1 插入的表需要构建好 -- 建表:6秒 500毫秒:抽数据100万:10秒 640毫秒.11秒 189毫秒 insert into T_HUGE_COMPRESS (ID, NAME) ( ...

  6. Spring 是如何造出一个 Bean 的

    前言 使用 Java 作为第一开发语言的朋友们,相信大家或多或少的都使用过 Spring 这个开发框架,可以说 Spring 框架真是我们 Java 程序员的春天,在 Spring 中 Bean 是其 ...

  7. 【Oracle故障处理】ORA-00845: MEMORY_TARGET not supported on this system

    场景:由于需要用RMAN恢复数据库,提取以前的数据表中的数据.虚拟机为节省资源调小了内存,启动数据库报了 如下错误: ORA-00845: MEMORY_TARGET not supported on ...

  8. Asynq 实现 Go 异步任务处理

    目录 Asynq 实现 Go 异步任务处理 一.概述 二.快速开始 1. 准备工作 2. 安装asynq软件包 3. 创建项目asynq_task 2. Redis连接项 4. Task任务 5. 编 ...

  9. Vue3 echarts 组件化使用 resizeObserver

    点击查看代码 const resizeObserver = ref(null); //进行初始化和监听窗口变化 onMounted(async () => { await nextTick(() ...

  10. AIRIOT物联网低代码平台如何配置交通部JT-808协议?

    属性配置可配置终端ID和SIM卡号,数据点配置决定设备传上来的哪些数据可以存储展示. 驱动配置可配置采集周期和通讯超时时间. AIRIOT物联网低代码平台如何配置交通部JT-808协议?具体操作如下: ...