高精板子合集(string版本)
#include<bits/stdc++.h> using namespace std; const int N=100001; int a[N],b[N],c[N]; inline string zhuan(int x){//int转化string string ant=""; while(x){ ant=char(x%10+'0')+ant; x/=10; } return ant; } inline bool cmp(string x,string y){//比较两个高精string数的大小 int len=x.size(),ten=y.size(); if(len!=ten){ return len>ten; } for(int i=0;i<len;++i){ if(x[i]!=y[i]){ return x[i]>y[i]; } } return true; }//若x>=y返回true,否则为false inline string jia1(string x,int y){//高精加低精 //初始化 memset(a,0,sizeof(a)); int len=x.size(); //储存 for(int i=0;i<len;++i){ a[i]=x[len-i-1]-'0'; } //操作 a[0]+=y; //进位 for(int i=0;i<len;++i){ if(a[i]>9){ a[i+1]+=a[i]/10; a[i]%=10; if(i==len-1){ len++; } continue; } break; } //输出 string ant=""; for(int i=len-1;i>=0;--i){ ant+=char(a[i]+'0'); } return ant; } inline string jia2(string x,string y){//高精加高精 //初始化 int len=x.size(),ten=y.size(); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); int k=max(len,ten); //储存 for(int i=0;i<len;++i){ a[i]=x[len-i-1]-'0'; } for(int i=0;i<ten;++i){ b[i]=y[ten-i-1]-'0'; } //操作 for(int i=0;i<k;++i){ c[i]=a[i]+b[i]; } //进位 for(int i=0;i<k;++i){ if(c[i]>9){ c[i+1]++; c[i]-=10; if(i==k-1){ k++; } } } //输出 string ant=""; for(int i=k-1;i>=0;--i){ ant+=char(c[i]+'0'); } return ant; } //注意:此处的高精减法默认x>=y inline string jian(string x,string y){//这是为高精除高精写的减法,正确的写法您需要特判x==y的情况 //初始化 memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); int len=x.size(),ten=y.size(); int k=max(len,ten); //储存 for(int i=0;i<len;++i){ a[i]=(x[len-i-1]-'0'); } for(int i=0;i<ten;++i){ b[i]=(y[ten-i-1]-'0'); } //操作 for(int i=0;i<k;++i){ a[i]-=b[i]; } //退位 for(int i=0;i<k;++i){ if(a[i]<0){ a[i+1]--; a[i]+=10; } } //消除前导零 while(k&&!a[k-1]){ k--; } //输出 string ant=""; for(int i=k-1;i>=0;--i){ ant+=char(a[i]+'0'); } return ant; } inline string cheng1(string x,int y){//高精乘低精 //初始化 int len=x.size(); memset(a,0,sizeof(a)); //储存 for(int i=0;i<len;++i){ a[i]=x[len-i-1]-'0'; } //操作 for(int i=0;i<len;++i){ a[i]*=y; } //进位 for(int i=0;i<len;++i){ if(a[i]>9){ a[i+1]+=a[i]/10; a[i]%=10; if(i==len-1){ len++; } } } //消去前导零 while(len>1&&!a[len-1]){ len--; } string ant=""; for(int i=len-1;i>=0;--i){ ant+=char(a[i]+'0'); } return ant; } inline string cheng2(string x,string y){//高精乘高精 //初始化 int len=x.size(),ten=y.size(); int k=len+ten-1; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); //储存 for(int i=0;i<len;++i){ a[i]=(x[len-i-1]-'0'); } for(int j=0;j<ten;++j){ b[j]=(y[ten-j-1]-'0'); } //操作 for(int i=0;i<len;++i){ for(int j=0;j<ten;++j){ c[i+j]+=a[i]*b[j]; } } //进位 for(int i=0;i<=k;++i){ if(c[i]>9){ c[i+1]+=c[i]/10; c[i]%=10; } } //消去前导零 while(k&&!c[k]){ k--; } //输出 string ant=""; for(int i=k;i>=0;--i){ ant+=char(c[i]+'0'); } return ant; } inline string chu1(string x,int y){//高精除低精 //初始化 int len=x.size(); int yu=0; bool flag=0;//是否有数字 string ans=""; //操作 for(int i=0;i<len;++i){ yu=yu*10+(x[i]-'0'); if(flag){ ans+=char(yu/y+'0'); yu%=y; continue; } if(yu>=y){ flag=1; ans+=char(yu/y+'0'); yu%=y; } } //输出 return ans; } inline string chu2(string x,string y){//高精除高精 //比较 if(!cmp(x,y)){ return "0"; } //初始化 int len=x.size(); string yu="",ans=""; bool flag=0; //操作 for(int i=0;i<len;++i){ yu+=x[i];
if(yu=="0"){
yu="";
} int tim=0; while(cmp(yu,y)){ yu=jian(yu,y); tim++; }
if(flag){ ans+=char(tim+'0'); continue; } if(tim){ flag=1; ans+=char(tim+'0'); } } //输出 return ans; } inline int mo1(string x,int y){//高精模低精 //初始化 int len=x.size(); int yu=0; //操作 for(int i=0;i<len;++i){ yu=yu*10+(x[i]-'0'); yu%=y; } //输出 return yu; } inline string mo2(string x,string y){//高精模高精 //比较 if(!cmp(x,y)){ return x; } //初始化 int len=x.size(); string yu=""; //操作 for(int i=0;i<len;++i){ yu+=x[i];
if(yu=="0"){
yu="";
} while(cmp(yu,y)){ yu=jian(yu,y); } } //输出 return yu; } int main(){ //freopen("ask.in","r",stdin); //freopen("ask.out","w",stdout); return 0; } /** * ┏┓ ┏┓+ + * ┏┛┻━━━┛┻┓ + + * ┃ ┃ * ┃ ━ ┃ ++ + + + * ████━████+ * ◥██◤ ◥██◤ + * ┃ ┻ ┃ * ┃ ┃ + + * ┗━┓ ┏━┛ * ┃ ┃ + + + +Code is far away from * ┃ ┃ + bug with the animal protecting * ┃ ┗━━━┓ 神兽保佑,代码无bug * ┃ ┣┓ * ┃ ┏┛ * ┗┓┓┏━┳┓┏┛ + + + + * ┃┫┫ ┃┫┫ * ┗┻┛ ┗┻┛+ + + + */