大数四则运算java(转)

  1 // 大数的四则运算
  2 #include <iostream>
  3 #include <string>
  4 #include <algorithm>
  5 using namespace std;
  6 
  7 class BIGINTEGEROPERATIONS
  8 {
  9 private:
 10     static int COMPARE(string number1, string number2)
 11     {
 12         int j;
 13 
 14         int length1 = number1.size();
 15         int length2 = number2.size();
 16 
 17         if(number1.size() == 0) number1 = "0";
 18         if(number2.size() == 0) number2 = "0";
 19 
 20         j = 0;
 21         for(int i = 0; i < length1; ++i)
 22         {
 23             if(number1[i] == '0') ++j;
 24             else break;
 25         }
 26         number1 = number1.substr(j);
 27 
 28         j = 0;
 29         for(int i = 0; i < length2; ++i)
 30         {
 31             if(number2[i] == '0') ++j;
 32             else break;
 33         }
 34         number2 = number2.substr(j);
 35 
 36         length1 = number1.size();
 37         length2 = number2.size();
 38 
 39         if(length1 > length2)
 40         {
 41             return 1;
 42         }
 43         else if(length1 == length2)
 44         {
 45             if(number1.compare(number2) > 0)
 46             {
 47                 return 1;
 48             }
 49             else if(number1.compare(number2) == 0)
 50             {
 51                 return 0;
 52             }
 53             else
 54             {
 55                 return -1;
 56             }
 57         }
 58         else 
 59         {
 60             return -1;
 61         }
 62 
 63         return 0;
 64     }
 65 
 66 public:
 67     static string PLUS(string number1,string number2)
 68     {
 69         int i;
 70         int length1 = number1.size();
 71         int length2 = number2.size();
 72 
 73         string result="";
 74 
 75         reverse(number1.begin(), number1.end());
 76         reverse(number2.begin(), number2.end());
 77 
 78         for(i = 0; i < length1 && i < length2; i++)
 79         {
 80             char c = (char)(number1[i] + number2[i] - 48);
 81             result = result + c;
 82         }
 83 
 84         while(i < length1)
 85         {
 86             result = result + number1[i]; 
 87             ++i;
 88         }
 89 
 90         while(i < length2)
 91         {
 92             result = result + number2[i]; 
 93             ++i;
 94         }
 95    
 96         int carry = 0;
 97         for(i = 0; i < (int)result.size(); ++i)
 98         {
 99             int value = result[i] - 48 + carry;
100             result[i] = (char)(value % 10 + 48);
101             carry = value / 10;
102         }
103    
104         if(carry !=0 ) 
105         {
106             result = result + (char)(carry + 48);
107         }
108 
109         for(i = result.size() - 1; i >= 0; i--)
110         {
111             if(result[i] != '0') break;
112         }
113 
114         result = result.substr(0, i + 1);
115 
116         reverse(result.begin(), result.end());
117         if(result.length() == 0) result = "0";
118         return result;
119     }
120 
121 
122     static string MINUS(string number1,string number2)
123     {
124         int i;
125         string result = "";
126 
127         int length1 = number1.size();
128         int length2 = number2.size();
129 
130         if(COMPARE(number2,number1) > 0)
131         {
132             return "-" + MINUS(number2, number1);
133         }
134 
135         reverse(number1.begin(),number1.end());
136         reverse(number2.begin(),number2.end());
137     
138         for(i = 0; i < length1 && i < length2; i++)
139         {
140             char c = number1[i] - number2[i] + 48;
141             result = result + c;
142         }
143 
144         if(i < length1)
145         {
146             for(; i < length1; i++)
147             {
148                 result = result + number1[i];
149             }
150         }
151    
152         int carry = 0;
153         for(i = 0; i < (int)result.length(); i++)
154         {
155             int value = result[i] - 48 + carry;
156             if(value < 0)
157             {
158                 value = value + 10;
159                 carry = -1;
160             }
161             else carry = 0;
162             result[i]=(char)(value + 48);
163         }
164 
165         for(i = result.size() - 1; i >= 0; i--)
166         {
167             if(result[i] != '0')break;
168         }
169 
170         result = result.substr(0, i+1);
171 
172         reverse(result.begin(), result.end());
173         if(result.length()==0) result = "0";
174         return result;
175     }
176 
177 
178     static string MULTIPLY(string number1, string number2)
179     {
180         int i, j;
181         int *iresult;
182         int length1 = number1.size();
183         int length2 = number2.size();
184         string result = "";
185 
186         reverse(number1.begin(), number1.end());
187         reverse(number2.begin(), number2.end());
188 
189         iresult = (int*)malloc(sizeof(int) * (length1 + length2 + 1));
190         memset(iresult, 0, sizeof(int) * (length1 + length2 + 1));
191 
192         for(i = 0; i < length1; i++)
193         {
194             for(j = 0; j < length2; j++)
195             {
196                 iresult[i+j] += ((number1[i] - 48) * (number2[j] - 48));
197             }
198         }
199 
200         int carry = 0;
201         for(i = 0; i < length1 + length2; i++)
202         {
203             int value = iresult[i] + carry;
204             iresult[i] = value % 10;
205             carry = value / 10;
206         }
207    
208         for(i = length1 + length2 - 1; i >= 0; i--)
209         {
210             if(iresult[i] != 0)break;
211         }
212 
213         for(; i >= 0; i--)
214         {
215             result = result + (char)(iresult[i]+48);
216         }
217 
218         free(iresult);
219 
220         if(result == "") result = "0";
221         return result;
222     }
223 
224 
225     // 缺省地,商数向下取整, floatpoint用于指定保留小数点的位数
226     static string DIVIDE(string number1, string number2, int floatpoint = 0)
227     {
228         int i, j, pos;
229         string result = "";
230         string tempstr = "";
231         int length1 = number1.size();
232         int length2 = number2.size();
233 
234         if((COMPARE(number2, number1) > 0) && (floatpoint == 0))
235         {
236             return "0";
237         }
238 
239         tempstr = number1.substr(0, length2);
240         pos = length2 - 1;
241    
242         while(pos < length1)
243         {
244             int quotient = 0;
245             while(COMPARE(tempstr, number2) >= 0)
246             {
247                 quotient++;
248                 tempstr = MINUS(tempstr, number2);
249             }
250        
251             result = result + (char)(quotient + 48);
252             pos++;
253             if(pos < length1)
254             {
255                 tempstr += number1[pos];
256             }
257         }
258 
259         if(floatpoint > 0)
260         {
261             result += '.';
262             string stmp = "1";
263             int itmp = 0;
264             for(int k = 0; k < floatpoint; ++k)
265             {
266                 stmp += '0';
267                 if(COMPARE(MULTIPLY(MINUS(number1, MULTIPLY(DIVIDE(number1, number2), number2)), stmp), number2) < 0)
268                 {
269                     result += '0';
270                     ++itmp;
271                 }
272             }
273 
274             string temp = DIVIDE(MULTIPLY(MINUS(number1, MULTIPLY(DIVIDE(number1, number2), number2)), stmp), number2);
275             if(temp[0] != '0') result += temp;
276         }
277 
278         j = result.size();
279         for(i = 0; i < j; i++) 
280         {
281             if(result[i] != '0') break;
282         }
283 
284         result = result.substr(i, j);
285 
286         return result;
287     }
288 
289     static string MOD(string number1, string number2)
290     {
291         if(COMPARE(number2, number1) > 0)
292         {
293             return number1;
294         }
295         else if(COMPARE(number2, number1) == 0)
296         {
297             return "0";
298         }
299         else
300         {
301             return MINUS(number1, MULTIPLY(DIVIDE(number1, number2), number2));
302         }
303     }
304 };
305 
306 int main(int argc, char* argv[])
307 {
308     string str1 = "9999999999999999999999999999999999999999";
309     string str2 = "9998999899989998999899989998999899989998";
310 
311     cout << BIGINTEGEROPERATIONS::PLUS(str1, str2) << endl;
312     cout << "===============" << endl;
313     cout << BIGINTEGEROPERATIONS::MINUS(str1, str2) << endl;
314     cout << "===============" << endl;
315     cout << BIGINTEGEROPERATIONS::MULTIPLY(str1, str2) << endl;
316     cout << "===============" << endl;
317     cout << BIGINTEGEROPERATIONS::DIVIDE(str1, str2, 4) << endl;
318     cout << "===============" << endl;
319     cout << BIGINTEGEROPERATIONS::MOD(str1, str2) << endl;
320 
321     return 0;
322 }

 

posted @ 2014-03-23 20:31  来自海上的鱼  阅读(288)  评论(0编辑  收藏  举报