高精度浮点型数据加,减,乘运算
大正数加法代码:(适用高精度浮点型,减法,乘法同样适用)
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:\n", 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 ("\n\n"); 80 81 }return 0; 82 }
大正数减法代码:
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 ("\n\n"); 187 } 188 }
大数乘法代码:
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 ("\n"); 99 } 100 return 0; 101 }
高精度浮点除法,能力有限没能写出来,若有大神路过,求指点一二!
以上代码,在dev_c中编译通过并经本人测试暂未发现bug,若使用者发现bug,请告知,感激不尽!