a+b

高精度加减乘除

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 using namespace std;
  5 const int mod=10000;
  6 int t,A,B;
  7 char s[1000005];
  8 struct node{
  9     int num[1000005];
 10     int len,neg;
 11     friend node operator+(node &x,node &y);
 12     friend node operator-(node &x,node &y);
 13     friend bool operator!=(node &x,node &y){
 14         if(x.len!=y.len){
 15             return true;
 16         }
 17         for(int i=1;i<=x.len;i++){
 18             if(x.num[i]!=y.num[i]){
 19                 return true;
 20             }
 21         }
 22         return false;
 23     }
 24     friend bool operator<=(node &x,node &y){
 25         if(x.len!=y.len){
 26             return (x.len<y.len);
 27         }
 28         for(int i=x.len;i>=1;i--){
 29             if(x.num[i]!=y.num[i]){
 30                 return (x.num[i]<y.num[i]);
 31             }
 32         }
 33         return true;
 34     }
 35     friend node operator+(node &x,node &y){
 36         node ret;
 37         memset(&ret,0,sizeof(ret));
 38         if(x.neg&&y.neg){
 39             ret.neg^=1;
 40         }
 41         else if(x.neg){
 42             x.neg^=1;
 43             return y-x;
 44         }
 45         else if(y.neg){
 46             y.neg^=1;
 47             return x-y;
 48         }
 49         ret.len=max(x.len,y.len);
 50         for(int i=1;i<=ret.len;i++){
 51             ret.num[i+1]+=(ret.num[i]+x.num[i]+y.num[i])/mod;
 52             (ret.num[i]+=x.num[i]+y.num[i])%=mod;
 53         }
 54         if(ret.num[ret.len+1])ret.len++;
 55         return ret;
 56     }
 57     friend node operator-(node &x,node &y){
 58         node ret;
 59         memset(&ret,0,sizeof(ret));
 60         if(x.neg&&y.neg){
 61             x.neg^=1;
 62             y.neg^=1;
 63             return y-x;
 64         }
 65         else if(x.neg){
 66             y.neg^=1;
 67             return x+y;
 68         }
 69         else if(y.neg){
 70             y.neg^=1;
 71             return x+y;
 72         }
 73         if(x!=y&&x<=y){
 74             ret.neg^=1;
 75             swap(x,y);
 76         }
 77         ret.len=max(x.len,y.len);
 78         for(int i=1;i<=ret.len;i++){
 79             if(x.num[i]<y.num[i]){
 80                 x.num[i]+=mod;
 81                 x.num[i+1]--;
 82             }
 83             ret.num[i]=x.num[i]-y.num[i];
 84         }
 85         while((ret.len>1)&&(!ret.num[ret.len])){
 86             ret.len--;
 87         }
 88         return ret;
 89     }
 90     friend node operator*(node &x,int y){
 91         node ret=x;
 92         if(x.neg&&y>0)ret.neg^=1;
 93         else if((!x.neg)&&y<0)ret.neg^=1,y=-y;
 94         for(int i=1;i<=ret.len;i++){
 95             ret.num[i+1]+=(ret.num[i]*y)/mod;
 96             (ret.num[i]*=y)%=mod;
 97         }
 98         if(ret.num[ret.len+1])ret.len++;
 99         return ret;
100     }
101     friend node operator*(node &x,node &y){
102         node ret;
103         memset(&ret,0,sizeof(ret));
104         ret.neg=x.neg^y.neg;
105         ret.len=x.len+y.len;
106         for(int i=1;i<=x.len;i++){
107             for(int j=1;j<=y.len;j++){
108                 ret.num[i+j]+=(ret.num[i+j-1]+x.num[i]*y.num[j])/mod;
109                 (ret.num[i+j-1]+=x.num[i]*y.num[j])%=mod;
110             }
111         }
112         while((ret.num[ret.len]==0)&&ret.len>1)ret.len--;
113         return ret;
114     }
115     friend pair<node,int> operator/(node &x,int y){
116         node ret=x;int rst=0;
117         if(x.neg&&y>0)ret.neg^=1;
118         else if((!x.neg)&&y<0)ret.neg^=1,y=-y;
119         for(int i=ret.len;i>=1;i--){
120             rst=ret.num[i]%y;
121             ret.num[i]=ret.num[i]/y;
122             ret.num[i-1]+=rst*mod;
123         }
124         while((ret.num[ret.len]==0)&&(ret.len>1))ret.len--;
125         return make_pair(ret,rst);
126     }
127 }a,b;
128 node read(){
129     node ret;
130     memset(&ret,0,sizeof(ret));
131     scanf("%s",s+1);
132     int len=strlen(s+1);
133     if(s[1]=='-')ret.neg^=1;
134     int cnt=0,mul=1;ret.len=1;
135     for(int i=len;i>ret.neg;i--){
136         ret.num[ret.len]+=mul*(s[i]-'0');
137         cnt++;mul*=10;
138         if(cnt==4){
139             cnt=0;mul=1;
140             ret.len++;
141         }
142     }
143     if(!ret.num[ret.len])ret.len--;
144     return ret;
145 }
146 void print(node x){
147     if(x.len==1&&x.num[1]==0){
148         printf("0
");
149         return;
150     }
151     if(x.neg)printf("-");
152     printf("%d",x.num[x.len]);
153     for(int i=x.len-1;i>=1;i--){
154         printf("%04d",x.num[i]);
155     }
156     printf("
");
157 }
158 int main(){
159     scanf("%d",&t);
160     if(t==1){
161         a=read();
162         b=read();
163         print(a+b);
164     }
165     if(t==2){
166         a=read();
167         b=read();
168         print(a-b);
169     }
170     if(t==3){
171         a=read();
172         b=read();
173         print(a*b);
174     }
175     if(t==4){
176         a=read();
177         scanf("%d",&B);
178         pair<node,int>ans=a/B;
179         print(ans.first);
180         printf("%d
",ans.second);
181     }
182     return 0;
183 }
原文地址:https://www.cnblogs.com/lnxcj/p/9927615.html