高精度加减乘除模板

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 }

 

以上是关于高精度加减乘除模板的主要内容,如果未能解决你的问题,请参考以下文章

高精模板(加减乘)

高精度模板

快速输入输出模板

高精度乘除法模板(AcWing.793 794)

高精板子

算法AcWing 794. 高精度除法