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\n"); 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("\n"); 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\n",ans.second); 181 } 182 return 0; 183 }