高精度 加法 减法 乘法 除法 整合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度 加法 减法 乘法 除法 整合相关的知识,希望对你有一定的参考价值。

此文为博主原创,转载时请通知博主,并把原文链接放在正文醒目位置。

很久不写高精了,虽说我觉得高精也不会考...还是稍微写一写,防止手生。

 

两个小时过去了……

 

集合了高精+高精、高精-高精、高精*高精、高精/低精。

目前还没发现什么错误,应该可以应付各种情况。

本来想允许它读入负数的,结果发现减法读负数太麻烦了...所以只能读非负数。

 

下面贴代码。

  1 #include<cstdio>
  2 #include<algorithm>
  3 #include<cmath>
  4 #include<cstring>
  5 char s[10002];
  6 long long rest;
  7 
  8 inline int Max(int a,int b)
  9 {return a>b?a:b;}
 10 
 11 struct BigInt
 12 {
 13     int len,flag;
 14     int num[10002];
 15     
 16     BigInt(){
 17         len = 0,flag = 0;
 18         memset(num,0,sizeof(num));
 19     }
 20     
 21     void clear() {
 22         len = 0,flag = 0;
 23         memset(num,0,sizeof(num));
 24     }
 25 }a,b,ans;
 26 
 27 void Swap(BigInt &a,BigInt &b)
 28 {
 29     BigInt t = a;
 30     a = b,b = t;
 31 }
 32 
 33 inline void Read(BigInt &ans)
 34 {
 35     ans.clear();
 36     scanf("%s",s);
 37     int len = 0,n = strlen(s);
 38     for(int i = n;i >= 0;-- i)
 39         if(s[i]>=0 && s[i]<=9)
 40             ans.num[++len] = s[i]-0;
 41     ans.len = len;
 42 }
 43 
 44 void Print(BigInt a)
 45 {
 46     if(a.flag) printf("-");
 47     int len = a.len;
 48     for(int i = len;i >= 1;-- i)
 49         printf("%d",a.num[i]);
 50     printf("\n");
 51 }
 52 
 53 long long CTL(BigInt a)
 54 {
 55     long long r = 0;
 56     for(int i = a.len;i >= 1;-- i)
 57         r = r*10+a.num[i];
 58     return r;
 59 }
 60 
 61 void Spin(int &a,int &b)
 62 {int t = a;a = b,b = t;}
 63 
 64 bool operator == (BigInt a,BigInt b)
 65 {
 66     if(a.len != b.len) return false;
 67     for(int i = 1;i <= a.len;++ i)
 68         if(a.num[i] != b.num[i])
 69             return false;
 70     return true;
 71 }
 72 
 73 bool operator < (BigInt a,BigInt b)
 74 {
 75     if(a.len > b.len) return false;
 76     if(a.len < b.len) return true;
 77     for(int i = a.len;i >= 1;-- i)
 78         if(a.num[i] > b.num[i])
 79             return false;
 80     return true;
 81 }
 82 
 83 BigInt operator + (BigInt a,BigInt b)
 84 {
 85     ans.clear();
 86     int len = Max(a.len,b.len)+1;
 87     int x = 0;
 88     for(int i = 1;i <= len;++ i)
 89     {
 90         ans.num[i] = a.num[i]+b.num[i]+x;
 91         x = ans.num[i]/10;
 92         ans.num[i] %= 10;
 93     }
 94     if(!ans.num[len]) len --;
 95     ans.len = len;
 96     return ans;
 97 }
 98 
 99 BigInt operator - (BigInt a,BigInt b)
100 {
101     ans.clear();
102     if(a == b) {
103         ans.num[++ans.len] = 0;
104         return ans;
105     }
106     else if(a < b) Swap(a,b),ans.flag = 1;
107     
108     int len = Max(a.len,b.len);
109     for(int i = 1;i <= len;++ i)
110     {
111         ans.num[i] += a.num[i]-b.num[i];
112         if(ans.num[i] < 0){
113             ans.num[i] += 10;
114             ans.num[i+1] --;
115         }
116     }
117     while(!ans.num[len]) len --;
118     ans.len = len;
119     return ans;
120 }
121 
122 BigInt operator * (BigInt a,BigInt b)
123 {
124     ans.clear();
125     int len = a.len+b.len+1;
126     int x = 0;
127     for(int i = 1;i <= a.len;++ i)
128     {
129         for(int j = 1;j <= b.len;++ j)
130         {
131             ans.num[i+j-1] += a.num[i]*b.num[j]+x;
132             x = ans.num[i+j-1]/10;
133             ans.num[i+j-1] %= 10;
134         }
135         ans.num[i+b.len] += x;
136         x = 0;
137     }
138     while(!ans.num[len] && len) len --;
139     if(!len) len = 1;
140     ans.len = len;
141     return ans;
142 }
143 
144 bool SpeciaL(BigInt a,BigInt b)
145 {
146     ans.clear();
147     if(a == b) {
148         ans.num[++ans.len] = 1;
149         printf("/: ");Print(ans);
150         printf("Rest = 0\n");
151         return true;
152     }
153     if(a < b) {
154         printf("/: 0\n");
155         printf("Rest = ");Print(a);
156         return true;
157     }
158     return false;
159 }
160 
161 BigInt operator / (BigInt a,long long b)
162 {
163     ans.clear();
164     int len = a.len,flag = 0,cnt = 0;
165     long long tmp = a.num[len];
166     for(int i = len-1;i >= 1;-- i)
167     {
168         if(tmp >= b)
169         {
170             flag = true;
171             ans.num[++cnt] = tmp/b,tmp %= b;
172         }
173         else if(flag) ans.num[++cnt] = 0;
174         tmp = tmp*10+a.num[i];
175     }
176     ans.num[++cnt] = tmp/b,tmp %= b;
177     ans.len = cnt;
178     rest = tmp;
179     for(int i = 1;i <= cnt/2;++ i)
180         Spin(ans.num[i],ans.num[cnt-i+1]);
181     return ans;
182 }
183 
184 int main()
185 {
186     Read(a),Read(b);
187     printf("+: ");Print(a+b);
188     printf("-: ");Print(a-b);
189     printf("*: ");Print(a*b);    
190     if(SpeciaL(a,b));
191     else{
192         long long B = CTL(b);
193         printf("/: ");Print(a/B);
194         printf("Rest = %lld\n",rest);
195     }
196     return 0;
197 }

 

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

高精度运算 加法减法

高精度乘法和除法

加法 减法 乘法 除法计算

仅使用加法、乘法、减法和最大值的整数除法

java里面double 做乘法和加法会丢失精度嘛?

请问怎样用加法-移位实现定点乘除法?