3115 高精度练习之减法:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cmath> 5 #include <string> 6 #include <algorithm> 7 #include <cstring> 8 #include <set> 9 #include <utility> 10 #include <locale> 11 #include <ctime> 12 using namespace std; 13 //using int64 = long long; 14 const int INF = 0x3f3f3f3f; 15 const int MaxN = 110; 16 17 string A, B; 18 string ans; 19 20 void Repair() 21 { 22 // 使两个字符串具有相同长度 23 if (A.size() < B.size()) 24 { 25 for (int i = A.size(); i < B.size(); ++i) 26 { 27 A = '0' + A; 28 } 29 }else 30 { 31 for (int i = B.size(); i < A.size(); ++i) 32 { 33 B = '0' + B; 34 } 35 } 36 } 37 38 void Solve() 39 { 40 41 bool isNegative = true; 42 // 倘若A<B,输出负号,并交换A和B的值 43 for (int i = 0; i < A.size(); ++i) 44 { 45 if (A[i] - '0' == B[i] - '0') continue; 46 if (A[i]-'0' > B[i]-'0') 47 { 48 isNegative = false; 49 } 50 break; 51 } 52 if (isNegative) { 53 cout << "-"; 54 swap(A, B); 55 } 56 // 大数减法 57 for (int i = A.size() - 1; i >= 0; --i) 58 { 59 if (A[i] < B[i]) 60 { 61 // 借位,注意所借之位为0的情况,借位之后,这些位变为9 62 int tmp = i - 1; 63 while ((A[tmp]-'0')-1 < 0) --tmp; 64 A[tmp] = '0' + ((A[tmp] - '0') - 1); 65 ++tmp; 66 while (tmp < i) 67 { 68 A[tmp] = '9'; 69 ++tmp; 70 } 71 ans = static_cast<char>('0' + ((A[i] - '0' + 10) - (B[i] - '0'))) + ans; 72 }else 73 { 74 // 无需借位,直接减 75 ans = static_cast<char>('0' + (A[i] - B[i])) + ans; 76 } 77 } 78 bool Judge = false; 79 for (int i = 0; i < ans.size(); ++i) 80 { 81 // 忽略前导零 82 if (ans[i] != '0' || Judge) 83 { 84 cout << ans[i]; 85 Judge = true; 86 } 87 } 88 cout << endl; 89 } 90 91 int main() 92 { 93 94 while (cin >> A >> B) 95 { 96 ans.clear(); 97 Repair(); 98 Solve(); 99 } 100 101 #ifdef HOME 102 cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl; 103 #endif 104 return 0; 105 }
3116 高精度练习之加法:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cmath> 5 #include <string> 6 #include <algorithm> 7 #include <cstring> 8 #include <set> 9 #include <utility> 10 #include <locale> 11 #include <ctime> 12 using namespace std; 13 //using int64 = long long; 14 const int INF = 0x3f3f3f3f; 15 const int MaxN = 110; 16 17 string A, B; 18 string ans; 19 20 void Repair() 21 { 22 if (A.size() < B.size()) 23 { 24 for (int i = A.size(); i < B.size(); ++i) 25 { 26 A = '0' + A; 27 } 28 }else 29 { 30 for (int i = B.size(); i < A.size(); ++i) 31 { 32 B = '0' + B; 33 } 34 } 35 } 36 37 void Solve() 38 { 39 int tmp = 0; 40 for (int i = A.size() - 1; i >= 0; --i) 41 { 42 if ((A[i]-'0') + (B[i] - '0') + tmp > 9) 43 { 44 ans = static_cast<char>('0' + ((A[i] - '0') + (B[i] - '0') + tmp) % 10) + ans; 45 tmp = 1; 46 }else 47 { 48 ans = static_cast<char>('0' + ((A[i] - '0') + (B[i] - '0') + tmp)) + ans; 49 tmp = 0; 50 } 51 } 52 if (tmp) ans = '1' + ans; 53 cout << ans << endl;; 54 } 55 56 int main() 57 { 58 59 while (cin >> A >> B) 60 { 61 ans.clear(); 62 Repair(); 63 Solve(); 64 } 65 66 #ifdef HOME 67 cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl; 68 #endif 69 return 0; 70 }
3117 高精度练习之乘法:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cmath> 5 #include <string> 6 #include <algorithm> 7 #include <cstring> 8 #include <set> 9 #include <utility> 10 #include <locale> 11 #include <ctime> 12 using namespace std; 13 //using int64 = long long; 14 const int INF = 0x3f3f3f3f; 15 const int MaxN = 110; 16 17 string _A, _B; 18 19 void Repair(string& A, string& B) 20 { 21 if (A.size() < B.size()) 22 { 23 for (int i = A.size(); i < B.size(); ++i) 24 { 25 A = '0' + A; 26 } 27 }else 28 { 29 for (int i = B.size(); i < A.size(); ++i) 30 { 31 B = '0' + B; 32 } 33 } 34 } 35 36 string Add(string A, string B) 37 { 38 Repair(A, B); 39 string ans; 40 int tmp = 0; 41 for (int i = A.size() - 1; i >= 0; --i) 42 { 43 if ((A[i] - '0') + (B[i] - '0') + tmp > 9) 44 { 45 ans = static_cast<char>('0' + ((A[i] - '0') + (B[i] - '0') + tmp) % 10) + ans; 46 tmp = 1; 47 } 48 else 49 { 50 ans = static_cast<char>('0' + ((A[i] - '0') + (B[i] - '0') + tmp)) + ans; 51 tmp = 0; 52 } 53 } 54 if (tmp) ans = '1' + ans; 55 return ans; 56 } 57 58 string Mul(string A, char B) 59 { 60 string ans; 61 int tmp = 0; 62 int result; 63 for (int i = A.size() - 1; i >= 0; --i) 64 { 65 result = (A[i] - '0')*(B - '0') + tmp; 66 tmp = result / 10; 67 ans = static_cast<char>('0' + result % 10) + ans; 68 } 69 if (tmp) ans = static_cast<char>('0' + tmp) + ans; 70 return ans; 71 } 72 73 void Solve(string A, string B) 74 { 75 string ans = "0"; 76 string tmp; 77 int num = 0; // 统计加的0的个数 78 for (int i = B.size() - 1; i >= 0; --i) 79 { 80 tmp = Mul(A, B[i]); 81 for (int j = 0; j < num; ++j) tmp += '0'; 82 ans = Add(ans, tmp); 83 ++num; 84 } 85 cout << ans << endl;; 86 } 87 88 int main() 89 { 90 91 while (cin >> _A >> _B) 92 { 93 Solve(_A, _B); 94 } 95 96 #ifdef HOME 97 cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl; 98 #endif 99 return 0; 100 }