高精度加减乘除模板

高精度板子。

我用的是重载运算符。

  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("\n");
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\n",res);
139     }
140     return 0;
141 }

原文地址:https://www.cnblogs.com/eternhope/p/9928623.html

时间: 2024-11-07 04:33:25

高精度加减乘除模板的相关文章

【转】ACM高精度加减乘除模板

#include <iostream> #include <string> using namespace std; inline int compare(string str1, string str2) { if(str1.size() > str2.size()) //长度长的整数大于长度小的整数 return 1; else if(str1.size() < str2.size()) return -1; else return str1.compare(str

C++高精度加减乘除模板

其中高精度乘法通过了POJ2389,其他没有测过,不过应该是没有问题的. 其中高精度除法返回一对string,分别表示商和余数. 代码: #include <bits/stdc++.h> using namespace std; const int maxn = 100010; int a[maxn], b[maxn], res[maxn]; string add(string s1, string s2) { // under condition: s1,s2>=0 // 初始化部分

c++的正整数高精度加减乘除

数值计算之高精度加减乘除 一.      高精度正整数的高精度计算 1.加法 2.减法 减法和加法的最大区别在于:减法是从高位开始相减,而加法是从低位开始相加 3.乘法:用高精度加法实现 l 乘法的主要思想是把乘法转化为加法进行运算.请先看下面的等式: 12345*4=12345+12345+12345+12345 12345*20=123450*2 12345*24=12345*20+12345*4 l 等式(1)说明,多位数乘一位数,可以直接使用加法完成. l 等式(2)说明,多位数乘形如d

hdu1134 Game of Connections 高精度 四则运算 模板

即卡特兰数. #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <string> #include <stack> #include <cmath> #include <queue> #include <set> #include <map> #define FOR

高精度加法模板

只想说这个模板好啊 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; char s[205][200]; void add(char a[],char b[],char back[]) { int i,j,k,up,x,y,z,l; char *c; if (strlen(a)>strlen(b)) l=s

【BZOJ2179】FFT快速傅立叶 高精度乘模板题

广告: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44015679"); } 题解: 其实没什么题解,只是贴个模板+理解注释 代码: #include <cmath> #include <cstdio> #include <cstring> #inc

Hdu 4762 网络赛 高精度大数模板+概率

注意题目中的这句话he put the strawberries on the cake randomly one by one,第一次选择草莓其实有N个可能,以某一个草莓为开头,然后顺序的随机摆放,所以最后的概率为n/m^(n-1),最后通过大数模板搞定该题的化简. C++代码 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<iomanip> 5 #include

HDU1402 FFT高精度乘法模板题

#include<bits/stdc++.h> using namespace std; //HDU 1402 求高精度乘法 const double PI = acos(-1.0); //复数结构体 struct Complex { double x,y;//实部和虚部x+yi Complex(double _x = 0.0,double _y = 0.0) { x = _x; y = _y; } Complex operator -(const Complex &b)const {

高精度加减乘除

高精度的运算主要依靠动态数组vector和字符串实现对每一位数字的运算. 1.高精度加法 #include <iostream> #include <algorithm> #include <vector> using namespace std; vector<int> add(vector<int> A,vector<int> B){ vector<int> C; int t=0; for(int i=0;i<A