高精度模板

明天考恩欧挨批,但是我今天才学高精度:)
随便敲敲

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxx=1e5+5;
string a,b;int ans[maxx];
inline void add(string xx,string yy){
	memset(ans,0,sizeof(ans));
	int lenx=xx.length(),leny=yy.length();
	int maxlen=max(lenx,leny);
	int x[maxlen+1],y[maxlen+1];
	memset(x,0,sizeof(x));memset(y,0,sizeof(y));
	//赋初值为0,否则会出错 
	for(int i=1;i<=lenx;i++) x[i]=xx[lenx-i]-'0';
	for(int i=1;i<=leny;i++) y[i]=yy[leny-i]-'0';
	int k=0,len=0;//k记录借位,len记录答案长度 
	for(int i=1;i<=lenx||i<=leny;i++){
		ans[i]=x[i]+y[i]+k;
		k=ans[i]/10;
		ans[i]%=10;
		len++;
	}
	ans[++len]=k;//最后再进一位 
	while(!ans[len]&&len>1) len--;
	//删除前导0,注意len最小为1(即和为0的情况) 
	for(int i=len;i>=1;i--) cout<<ans[i];
	cout<<endl;
	return;
}
inline void sub(string xx,string yy){
	memset(ans,0,sizeof(ans));
	int lenx=xx.length(),leny=yy.length();
	int maxlen=max(lenx,leny);
	int x[maxlen+1],y[maxlen+1];
	memset(x,0,sizeof(x));memset(y,0,sizeof(y));
	//这里必须赋初值,否则做减法时会出错 
	if(lenx<leny||(lenx==leny&&xx<yy)){
		cout<<"-";swap(xx,yy);swap(lenx,leny);
	}//注意lenx和leny也需要交换 
	for(int i=1;i<=lenx;i++) x[i]=xx[lenx-i]-'0';
	for(int i=1;i<=leny;i++) y[i]=yy[leny-i]-'0';
	int len=0;//记录答案长度 
	for(int i=1;i<=lenx;i++){
		if(x[i]-y[i]<0) x[i]+=10,x[i+1]--;
		ans[i]=x[i]-y[i];len++;
	}
	while(ans[len]==0&&len>1) len--;
	for(int i=len;i>=1;i--) cout<<ans[i];
	cout<<endl;return; 
}
inline void mul(string xx,string yy){
	memset(ans,0,sizeof(ans));
	int lenx=xx.length(),leny=yy.length();
	int x[lenx+1],y[leny+1];
	for(int i=1;i<=lenx;i++) x[i]=xx[lenx-i]-'0';
	for(int i=1;i<=leny;i++) y[i]=yy[leny-i]-'0';
	int k=0,len=lenx+leny;
	for(int i=1;i<=lenx;i++){
		for(int j=1;j<=leny;j++){
			ans[i+j-1]+=x[i]*y[j]+k;
			k=ans[i+j-1]/10;
			ans[i+j-1]%=10;
		}
		ans[leny+i]+=k;k=0;
	}
	while(!ans[len]&&len>1) len--; 
	for(int i=len;i>=1;i--) cout<<ans[i];
	cout<<endl;return;
}
inline void div(string xx,int y){
	memset(ans,0,sizeof(ans));
	int lenx=xx.length();
	int x[lenx+1];
	for(int i=1;i<=lenx;i++) x[i]=xx[i-1]-'0';
	int k=0,len=1;
	for(int i=1;i<=lenx;i++){
		ans[i]=(k*10+x[i])/y;
		k=(k*10+x[i])%y;
	}
	while(ans[len]==0&&len<lenx) len++;
	for(int i=len;i<=lenx;i++) cout<<ans[i];cout<<endl<<k;
	cout<<endl;return;
}
signed main(){
	cin>>a>>b;int bb=0;//注意给变量赋初值 
	for(int i=0;i<=b.length()-1;i++)
	bb=bb*10+b[i]-'0';//预处理低精除数 
	add(a,b);sub(a,b);mul(a,b);div(a,bb); 
	return 0;
}
posted @   Gcint  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示