高精度浮点型数据加,减,乘运算

大正数加法代码:(适用高精度浮点型,减法,乘法同样适用)

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <string>
 5 using namespace std;
 6 #define CLE(name) memset(name, 0, sizeof (name))
 7 const int max_n = 1010;
 8 
 9 int num1[max_n], num2[max_n];
10 
11 int main ()
12 {
13     string str1, str2;
14     int len1, len2;
15     int tag1, tag2;
16     int sign1, sign2, sign;
17     int i, k, bg, ed, up;
18     int cas = 1;
19     while (cin >> str1 >> str2)
20     {
21         CLE(num1), CLE(num2);
22         len1 = str1.length();
23         len2 = str2.length();
24         tag1 = str1.find("."); //数字一小数点的位置,没有则返回-1,有则返回所在位置 
25         tag2 = str2.find(".");
26         sign1 = tag1 == -1 ? 0 : len1 - tag1 - 1;
27         sign2 = tag2 == -1 ? 0 : len2 - tag2 - 1;
28         sign = sign1 > sign2 ? sign1 : sign2;
29         for (i = len1-1, k = sign - sign1; i >= 0; i --)
30         {
31             if (str1[i] != '.')
32                 num1[k++] = str1[i] - '0';
33         }
34         for (i = len2-1, k = sign - sign2; i >= 0; i --)
35         {
36             if (str2[i] != '.')
37             {
38                 num2[k ++] = str2[i] - '0';
39             }
40         }
41         for (i = 0, up = 0; i < max_n; i ++)
42         {
43             num1[i] = num1[i] + num2[i] + up;
44             up = num1[i]/10;
45             num1[i] %= 10;
46         }
47         bg = 0;
48         ed = sign;
49         printf ("Case %d:
", cas++ );
50         cout << str1 << " + " << str2 << " = ";
51         for (i = max_n - 1; i >= 0; i --)
52         {
53             if (i == sign - 1)
54             {
55                 bg = i;
56                 printf ("0");
57                 break;
58             }
59             if (num1[i])
60             {
61                 bg = i;
62                 break;
63             }
64         }
65         for (i = 0; i < sign; i ++)
66         {
67             if (num1[i])
68             {
69                 ed = i;
70                 break;
71             }
72         }
73         for (i = bg; i >= ed; i --)
74         {
75             if (i == sign - 1)
76                 printf (".");
77             printf ("%d", num1[i]);
78         }
79         printf ("

");
80 
81     }return 0;
82 }
View Code

大正数减法代码:

  1 #include <iostream>
  2 #include <stdio.h>
  3 #include <math.h>
  4 #include <string>
  5 #include <string.h>
  6 using namespace std;
  7 #define CLE(name) memset(name, 0, sizeof (name))
  8 const int max_n = 1010;
  9 
 10 int num1[max_n], num2[max_n];
 11 string str1, str2;
 12 
 13 int deal (int len1, int len2, int tag1, int tag2)
 14 {
 15     int min_l = len1 >= len2 ? len1 : len2;
 16 //    cout << tag1 << " " << tag2 << endl;
 17     if (tag1 > tag2 && tag2 != -1)
 18         return 1;
 19     else if (tag1 < tag2 && tag1 != -1)
 20         return 2;
 21     else if (tag1 == -1 && tag2 == -1)
 22     {
 23         if (len1 != len2)
 24             return len1 > len2 ? 1 : 2;
 25         for (int i = len1 - 1; i >= 0; i --)
 26         {
 27             if (str1[i] > str2[i])
 28                 return 1;
 29             else if (str1[i] < str2[i])
 30                 return 2;
 31         }
 32     }
 33     else if (tag1 == tag2)
 34     {
 35         for (int i = tag1 - 1; i >= 0; i --)
 36         {
 37             if (str1[i] > str2[i])
 38                 return 1;
 39             else if (str1[i] < str2[i])
 40                 return 2;
 41         }
 42         for (int i = tag1 + 1; i < min_l; i ++)
 43         {
 44             if (str1[i] > str2[i])
 45                 return 1;
 46             else if (str1[i] < str2[i])
 47                 return 2;
 48         }
 49         if (min_l == len1)
 50             return 2;
 51         if (min_l == len2)
 52             return 1;
 53     }
 54     else if (tag1 == -1)
 55     {
 56         int tmp_l = len2 - tag2;
 57         if (tmp_l != len1)
 58             return len1 > tmp_l? 1 : 2;
 59         else
 60         {
 61             for (int i = len1 - 1; i >= 0; i --)
 62             {    
 63                 if (str1[i] > str2[i])
 64                     return 1;
 65                 else if (str1[i] < str2[i])
 66                     return 2;
 67             }
 68         }
 69         return 2;
 70     }
 71     else if (tag2 == -1)
 72     {
 73         int tmp_l = len1 - tag1;
 74         if (tmp_l != len2)
 75             return tmp_l > len2? 1 : 2;
 76         else
 77         {
 78             for (int i = len2 - 1; i >= 0; i --)
 79             {    
 80                 if (str1[i] > str2[i])
 81                     return 1;
 82                 else if (str1[i] < str2[i])
 83                     return 2;
 84             }
 85         }
 86         return 1;
 87     }
 88     return 1;
 89 }
 90 
 91 int main ()
 92 {
 93     int judge;
 94 
 95     int len1, len2, tag1, tag2;
 96     int sign1, sign2, sign;
 97     int bg, ed, i, k, bro;
 98     while (cin >> str1 >> str2)
 99     {
100         CLE(num1), CLE(num2);
101         len1 = str1.length();
102         len2 = str2.length();
103         tag1 = str1.find(".");
104         tag2 = str2.find(".");
105         sign1 = tag1 == -1 ? 0 : len1 - tag1 - 1;
106         sign2 = tag2 == -1 ? 0 : len2 - tag2 - 1;
107         sign = sign1 > sign2 ? sign1 : sign2;
108         judge = deal (len1, len2, tag1, tag2);
109         if (judge == 1)
110         {
111             k = sign - sign1;
112             for (i = len1-1; i >= 0; i --)
113             {
114                 if (str1[i] != '.')
115                     num1[k ++] = str1[i] - '0';
116             }
117             k = sign -sign2;
118             for (i = len2-1; i >= 0; i --)
119             {
120                 if (str2[i] != '.')
121                     num2[k ++] = str2[i] - '0';
122             }
123         }
124         else
125         {
126             k = sign - sign2;
127             for (i = len2-1; i >= 0; i --)
128             {
129                 if (str2[i] != '.')
130                     num1[k ++] = str2[i] - '0';
131             }
132             k = sign - sign1;
133             for (i = len1-1; i >= 0; i --)
134             {
135                 if (str1[i] != '.')
136                     num2[k ++] = str1[i] - '0';
137             }
138         }
139         for (i = 0, bro = 0; i < max_n; i ++)
140         {
141             if (num1[i] - num2[i] < 0)
142             {
143                 bro = 1;
144                 num1[i + 1] --;
145                 num1[i] = 10*bro + num1[i] - num2[i];
146             }
147             else
148             {
149                 num1[i] = num1[i] - num2[i];
150             }
151         }
152 //        cout << judge << " " << sign << endl;
153         cout << str1 << " - " << str2 << " = ";
154         if (judge == 2)
155             printf ("-");
156         bg = 0;
157         ed = sign;
158         for (i = max_n - 1; i >= 0; i --)
159         {
160             if (i == sign - 1)
161             {
162                 bg = i;
163                 printf ("0");
164                 break;
165             }
166             if (num1[i])
167             {
168                 bg = i;
169                 break;
170             }
171         }
172         for (i = 0; i < sign; i ++)
173         {
174             if (num1[i])
175             {
176                 ed = i;
177                 break;
178             }
179         }
180         for (i = bg; i >= ed; i --)
181         {
182             if (i == sign - 1)
183                 printf (".");
184             printf ("%d", num1[i]);
185         }
186         printf ("

");
187     }
188 }
View Code

大数乘法代码:

  1 #include <iostream>
  2 #include <stdio.h>
  3 #include <string.h>
  4 #include <string>
  5 using namespace std;
  6 
  7 #define CLE(name) memset(name, 0, sizeof (name))
  8 const int max_n = 1010;
  9 int num1[max_n], num2[max_n];
 10 int result[2*max_n];
 11 string str1, str2;
 12 
 13 int main ()
 14 {
 15     int i, k, bg, ed, judge, up;
 16     int sign, sign1, sign2;
 17     int tag1, tag2;
 18     int len1, len2;
 19     while (cin >> str1 >> str2)
 20     {
 21         CLE(num1), CLE(num2), CLE(result);
 22         len1 = str1.length();
 23         len2 = str2.length();
 24         tag1 = str1.find(".");
 25         tag2 = str2.find(".");
 26         sign1 = tag1 == -1 ? 0 : len1 - tag1 - 1;
 27         sign2 = tag2 == -1 ? 0 : len2 - tag2 - 1;
 28         sign = sign1 + sign2;
 29         judge = 0;
 30         for (i = len1 - 1, k = 0; i >= 0; i --)
 31         {
 32             if (str1[i] == '-')
 33             {
 34                 judge ++;
 35                 break;
 36             }
 37             if (str1[i] != '.')
 38                 num1[k ++] = str1[i] - '0';
 39         }
 40         for (i = len2 - 1, k = 0; i >= 0; i --)
 41         {
 42             if (str2[i] == '-')
 43             {
 44                 judge ++;
 45                 break;
 46             }
 47             if (str2[i] != '.')
 48                 num2[k ++] = str2[i] - '0';
 49         }
 50         for (i = 0; i < max_n; i ++)
 51         {
 52             for (k = 0; k < max_n; k ++)
 53             {
 54                 result[i+k] += num1[i] * num2[k];
 55 
 56             }
 57         }
 58         for (i = 0, up = 0; i < 2*max_n; i ++)
 59         {
 60             int tmp = result[i];
 61             result[i] = (result[i] + up) % 10;
 62             up = (tmp + up) / 10;
 63         }
 64         cout << str1 << " * " <<str2 << " = ";
 65         if(judge%2)
 66             printf("-");
 67         bg = 0;
 68         ed = sign;
 69         for (i = 2*max_n - 1; i >= 0; i --)
 70         {
 71             if (i == sign - 1 && sign)
 72             {
 73                 bg = i;
 74                 break;
 75             }
 76             if (result[i])
 77             {
 78                 bg = i;
 79                 break;
 80             }
 81         }
 82         for (i = 0; i < sign; i ++)
 83         {
 84             if (num1[i])
 85             {
 86                 ed = i;
 87                 break;
 88             }
 89         }
 90         for (i = bg; i >= ed; i --)
 91         {
 92             if (i == sign - 1 && sign)
 93             {
 94                 printf ("%s", i==bg ? "0." : ".");
 95             }
 96             printf ("%d", result[i]);
 97         }
 98         printf ("
");
 99     }
100     return 0;
101 }
View Code

高精度浮点除法,能力有限没能写出来,若有大神路过,求指点一二!

以上代码,在dev_c中编译通过并经本人测试暂未发现bug,若使用者发现bug,请告知,感激不尽!

原文地址:https://www.cnblogs.com/shengshouzhaixing/p/3160070.html