高精度运算(压位)
单精加过程:
void add_dan(ll *a,ll num,ll len1,ll &len) { a[1]+=num;len=1; while(a[len+1]>=ya) { ++len; a[len+1]+=a[len]/ya; a[len]=a[len]%ya; } len=max(len,len1); }
高精加过程:
void add_gao(ll *a,ll *b,ll len1,ll len2,ll &len) { len=max(len1,len2); for(int i=1;i<=len;i++) { a[i]+=b[i]; if(a[i]>=ya) { a[i+1]+=a[i]/ya; a[i]=a[i]%ya; } } while(a[len+1]) { ++len; if(a[len]>=ya) { a[len+1]+=a[len]/ya; a[len]=a[len]%ya; } } }
高精减过程:
void jian_gao(ll *a,ll *b,ll len1,ll len2,ll &len) { len=max(len1,len2); for(int i=1;i<=len;i++) { a[i]-=b[i]; if(a[i]<0) { a[i+1]--; a[i]+=ya; } } ++len; while(!a[len-1]) --len; --len; }
单精乘过程:
void mul_dan(ll *a,ll num,ll len1,ll &len) { ll temp=0; len=len1; for(int i=1;i<=len1;i++) { a[i]=temp+a[i]*num; if(a[i]>=ya) { temp=a[i]/ya; a[i]%=ya; } else temp=0; } if(temp) a[++len]=temp; while(a[len+1]) { ++len; if(a[len]>=ya) { a[len+1]+=a[len]/ya; a[len]=a[len]%ya; } } }
高精乘过程:
void mul_gao(ll *a,ll *b,ll *c,ll len1,ll len2,ll &len) { len=len1+len2-1; for(int i=1;i<=len1;i++) for(int j=1;j<=len2;j++) { c[i+j-1]+=a[i]*b[j]; if(c[i+j-1]>=ya) { c[i+j]+=c[i+j-1]/ya; c[i+j-1]%=ya; } } while(c[len+1]) { ++len; if(c[len]>=ya) { c[len+1]+=c[len]/ya; c[len]=c[len]%ya; } } }
单精除过程:
void div_dan(ll *a,ll *c,ll num,ll len1,ll &len) { ll temp=0; for(int i=len1;i>=1;i--) { c[i]=(temp*ya+a[i])/num; temp=(temp*ya+a[i])%num; } ++len; while(!a[len-1]) --len; --len; }
输出:
void pri(ll *a,ll len) { printf("%lld",a[max(1ll,len)]); for(int i=max(1ll,len)-1;i>=1;i--) printf("%08lld",a[i]); puts(""); }
总代码如下:
#include <cstdlib> #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; typedef long long ll; inline int read() { int a=0,p=0;char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-') ch=getchar(); if(ch=='-') p=1,ch=getchar(); while(ch>='0'&&ch<='9') a=(a<<3)+(a<<1)+ch-'0',ch=getchar(); return p?-a:a; } const int N=1000010; const ll ya=100000000; char t1[N],t2[N]; ll a[N],b[N],c[N],len1,len2,len; //----------------------*** + ***---------------------// void add_gao(ll *a,ll *b,ll len1,ll len2,ll &len) { len=max(len1,len2); for(int i=1;i<=len;i++) { a[i]+=b[i]; if(a[i]>=ya) { a[i+1]+=a[i]/ya; a[i]=a[i]%ya; } } while(a[len+1]) { ++len; if(a[len]>=ya) { a[len+1]+=a[len]/ya; a[len]=a[len]%ya; } } } void add_dan(ll *a,ll num,ll len1,ll &len) { a[1]+=num;len=1; while(a[len+1]>=ya) { ++len; a[len+1]+=a[len]/ya; a[len]=a[len]%ya; } len=max(len,len1); } //----------------------*** + ***---------------------// //----------------------*** - ***---------------------// void jian_gao(ll *a,ll *b,ll len1,ll len2,ll &len) { len=max(len1,len2); for(int i=1;i<=len;i++) { a[i]-=b[i]; if(a[i]<0) { a[i+1]--; a[i]+=ya; } } ++len; while(!a[len-1]) --len; --len; } //----------------------*** - ***---------------------// //----------------------*** * ***---------------------// void mul_gao(ll *a,ll *b,ll *c,ll len1,ll len2,ll &len) { len=len1+len2-1; for(int i=1;i<=len1;i++) for(int j=1;j<=len2;j++) { c[i+j-1]+=a[i]*b[j]; if(c[i+j-1]>=ya) { c[i+j]+=c[i+j-1]/ya; c[i+j-1]%=ya; } } while(c[len+1]) { ++len; if(c[len]>=ya) { c[len+1]+=c[len]/ya; c[len]=c[len]%ya; } } } void mul_dan(ll *a,ll num,ll len1,ll &len) { ll temp=0; len=len1; for(int i=1;i<=len1;i++) { a[i]=temp+a[i]*num; if(a[i]>=ya) { temp=a[i]/ya; a[i]%=ya; } else temp=0; } if(temp) a[++len]=temp; while(a[len+1]) { ++len; if(a[len]>=ya) { a[len+1]+=a[len]/ya; a[len]=a[len]%ya; } } } //----------------------*** * ***---------------------// //----------------------*** / ***---------------------// void div_dan(ll *a,ll *c,ll num,ll len1,ll &len) { ll temp=0; for(int i=len1;i>=1;i--) { c[i]=(temp*ya+a[i])/num; temp=(temp*ya+a[i])%num; } ++len; while(!a[len-1]) --len; --len; } //----------------------*** / ***---------------------// //----------------------*** P ***---------------------// void pri(ll *a,ll len) { printf("%lld",a[max(1ll,len)]); for(int i=max(1ll,len)-1;i>=1;i--) printf("%08lld",a[i]); puts(""); } //----------------------*** P ***---------------------// int main() { // freopen(".in","r",stdin); // freopen(".out","w",stdout); scanf("%s",t1);scanf("%s",t2); len1=strlen(t1);len2=strlen(t2); ll cnt=0; for(int i=len1-1;i>=0;i-=8) { ++cnt; if(i<8) { for(int j=0;j<=i;j++) a[cnt]=a[cnt]*10+t1[j]-'0'; break; } for(int j=i-7;j<=i;j++) a[cnt]=a[cnt]*10+t1[j]-'0'; } len1=cnt;cnt=0; for(int i=len2-1;i>=0;i-=8) { ++cnt; if(i<8) { for(int j=0;j<=i;j++) b[cnt]=b[cnt]*10+t2[j]-'0'; break; } for(int j=i-7;j<=i;j++) b[cnt]=b[cnt]*10+t2[j]-'0'; } len2=cnt; // a+b // add_gao(a,b,len1,len2,len); // pri(a,len); // a-b // jian_gao(a,b,len1,len2,len); // pri(a,len); // a*b // mul_gao(a,b,len1,len2,len); // pri(a,len); // a*b // mul_dan(a,num,len1,len); // pri(a,len); // a/b // div_dan(a,c,num,len1,len); // pri(c,len); return 0; }