高精度加减乘除模板
Posted eternhope
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度加减乘除模板相关的知识,希望对你有一定的参考价值。
高精度板子。
我用的是重载运算符。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 5 struct mega 6 { 7 int num[200005]; 8 int len,val; 9 bool anti; 10 void reset() 11 { 12 len=val=0; 13 anti=false; 14 memset(num,0,sizeof(num)); 15 } 16 friend bool operator < (mega &a,mega &b) 17 { 18 if(a.len!=b.len)return a.len<b.len; 19 for(int i=a.len;i;i--) 20 if(a.num[i]!=b.num[i]) 21 return a.num[i]<b.num[i]; 22 return false; 23 } 24 friend mega operator + (mega &a,mega &b) 25 { 26 mega ans; 27 ans.reset(); 28 ans.len=std::max(a.len,b.len); 29 for(int i=1;i<=ans.len;i++) 30 { 31 ans.num[i]+=a.num[i]+b.num[i]; 32 ans.num[i+1]=ans.num[i]/10; 33 ans.num[i]%=10; 34 } 35 if(ans.num[ans.len+1])ans.len++; 36 return ans; 37 } 38 friend mega operator - (mega &a,mega &b) 39 { 40 mega ans; 41 ans.reset(); 42 ans.len=std::max(a.len,b.len); 43 if(a<b) 44 { 45 ans.anti=1; 46 std::swap(a,b); 47 } 48 for(int i=1;i<=ans.len;i++) 49 { 50 ans.num[i]+=a.num[i]-b.num[i]; 51 if(ans.num[i]<0)ans.num[i]+=10,ans.num[i+1]--; 52 } 53 while((!ans.num[ans.len])&&ans.len)ans.len--; 54 if(!ans.len)ans.len++; 55 return ans; 56 } 57 friend mega operator * (mega &a,mega &b) 58 { 59 mega ans; 60 ans.reset(); 61 ans.anti=a.anti^b.anti; 62 ans.len=a.len+b.len; 63 for(int i=1;i<=a.len;i++) 64 for(int j=1;j<=b.len;j++) 65 ans.num[i+j-1]+=a.num[i]*b.num[j]; 66 for(int i=1;i<=ans.len;i++) 67 ans.num[i+1]+=ans.num[i]/10,ans.num[i]%=10; 68 while((!ans.num[ans.len])&&ans.len)ans.len--; 69 if(!ans.len)ans.len++; 70 return ans; 71 } 72 friend mega operator / (mega &a,mega &b) 73 { 74 mega ans; 75 ans.reset(); 76 int div=b.val; 77 ans.len=a.len; 78 int tmp=0; 79 for(int i=a.len;i;i--) 80 { 81 tmp=tmp*10+a.num[i]; 82 ans.num[i]=tmp/div; 83 tmp%=div; 84 } 85 while((!ans.num[ans.len])&&ans.len)ans.len--; 86 if(!ans.len)ans.len++; 87 return ans; 88 } 89 friend int operator % (mega &a,mega &b) 90 { 91 int ans=0; 92 int mod=b.val; 93 for(int i=a.len;i;i--)ans=(ans*10+a.num[i])%mod; 94 return ans; 95 } 96 void read() 97 { 98 char buf[100005]; 99 scanf("%s",buf+1); 100 len=strlen(buf+1); 101 for(int i=1;i<=len;i++) 102 num[len-i+1]=buf[i]-‘0‘,val=val*10+buf[i]-‘0‘; 103 } 104 void print() 105 { 106 if(anti)putchar(‘-‘); 107 for(int i=len;i;i--)printf("%d",num[i]); 108 printf(" "); 109 } 110 }a,b; 111 112 int main() 113 { 114 int op; 115 scanf("%d",&op); 116 a.read(); 117 b.read(); 118 if(op==1) 119 { 120 mega ans=a+b; 121 ans.print(); 122 } 123 if(op==2) 124 { 125 mega ans=a-b; 126 ans.print(); 127 } 128 if(op==3) 129 { 130 mega ans=a*b; 131 ans.print(); 132 } 133 if(op==4) 134 { 135 mega ans=a/b; 136 int res=a%b; 137 ans.print(); 138 printf("%d ",res); 139 } 140 return 0; 141 }
以上是关于高精度加减乘除模板的主要内容,如果未能解决你的问题,请参考以下文章