高精度入门(减法、加法、乘法)之 CODE[VS] 3115、3116、3117
2015-09-30 02:07
337 查看
3115 高精度练习之减法:
3116 高精度练习之加法:
3117 高精度练习之乘法:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <string> #include <algorithm> #include <cstring> #include <set> #include <utility> #include <locale> #include <ctime> using namespace std; //using int64 = long long; const int INF = 0x3f3f3f3f; const int MaxN = 110; string A, B; string ans; void Repair() { // 使两个字符串具有相同长度 if (A.size() < B.size()) { for (int i = A.size(); i < B.size(); ++i) { A = '0' + A; } }else { for (int i = B.size(); i < A.size(); ++i) { B = '0' + B; } } } void Solve() { bool isNegative = true; // 倘若A<B,输出负号,并交换A和B的值 for (int i = 0; i < A.size(); ++i) { if (A[i] - '0' == B[i] - '0') continue; if (A[i]-'0' > B[i]-'0') { isNegative = false; } break; } if (isNegative) { cout << "-"; swap(A, B); } // 大数减法 for (int i = A.size() - 1; i >= 0; --i) { if (A[i] < B[i]) { // 借位,注意所借之位为0的情况,借位之后,这些位变为9 int tmp = i - 1; while ((A[tmp]-'0')-1 < 0) --tmp; A[tmp] = '0' + ((A[tmp] - '0') - 1); ++tmp; while (tmp < i) { A[tmp] = '9'; ++tmp; } ans = static_cast<char>('0' + ((A[i] - '0' + 10) - (B[i] - '0'))) + ans; }else { // 无需借位,直接减 ans = static_cast<char>('0' + (A[i] - B[i])) + ans; } } bool Judge = false; for (int i = 0; i < ans.size(); ++i) { // 忽略前导零 if (ans[i] != '0' || Judge) { cout << ans[i]; Judge = true; } } cout << endl; } int main() { while (cin >> A >> B) { ans.clear(); Repair(); Solve(); } #ifdef HOME cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl; #endif return 0; }
3116 高精度练习之加法:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <string> #include <algorithm> #include <cstring> #include <set> #include <utility> #include <locale> #include <ctime> using namespace std; //using int64 = long long; const int INF = 0x3f3f3f3f; const int MaxN = 110; string A, B; string ans; void Repair() { if (A.size() < B.size()) { for (int i = A.size(); i < B.size(); ++i) { A = '0' + A; } }else { for (int i = B.size(); i < A.size(); ++i) { B = '0' + B; } } } void Solve() { int tmp = 0; for (int i = A.size() - 1; i >= 0; --i) { if ((A[i]-'0') + (B[i] - '0') + tmp > 9) { ans = static_cast<char>('0' + ((A[i] - '0') + (B[i] - '0') + tmp) % 10) + ans; tmp = 1; }else { ans = static_cast<char>('0' + ((A[i] - '0') + (B[i] - '0') + tmp)) + ans; tmp = 0; } } if (tmp) ans = '1' + ans; cout << ans << endl;; } int main() { while (cin >> A >> B) { ans.clear(); Repair(); Solve(); } #ifdef HOME cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl; #endif return 0; }
3117 高精度练习之乘法:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <string> #include <algorithm> #include <cstring> #include <set> #include <utility> #include <locale> #include <ctime> using namespace std; //using int64 = long long; const int INF = 0x3f3f3f3f; const int MaxN = 110; string _A, _B; void Repair(string& A, string& B) { if (A.size() < B.size()) { for (int i = A.size(); i < B.size(); ++i) { A = '0' + A; } }else { for (int i = B.size(); i < A.size(); ++i) { B = '0' + B; } } } string Add(string A, string B) { Repair(A, B); string ans; int tmp = 0; for (int i = A.size() - 1; i >= 0; --i) { if ((A[i] - '0') + (B[i] - '0') + tmp > 9) { ans = static_cast<char>('0' + ((A[i] - '0') + (B[i] - '0') + tmp) % 10) + ans; tmp = 1; } else { ans = static_cast<char>('0' + ((A[i] - '0') + (B[i] - '0') + tmp)) + ans; tmp = 0; } } if (tmp) ans = '1' + ans; return ans; } string Mul(string A, char B) { string ans; int tmp = 0; int result; for (int i = A.size() - 1; i >= 0; --i) { result = (A[i] - '0')*(B - '0') + tmp; tmp = result / 10; ans = static_cast<char>('0' + result % 10) + ans; } if (tmp) ans = static_cast<char>('0' + tmp) + ans; return ans; } void Solve(string A, string B) { string ans = "0"; string tmp; int num = 0; // 统计加的0的个数 for (int i = B.size() - 1; i >= 0; --i) { tmp = Mul(A, B[i]); for (int j = 0; j < num; ++j) tmp += '0'; ans = Add(ans, tmp); ++num; } cout << ans << endl;; } int main() { while (cin >> _A >> _B) { Solve(_A, _B); } #ifdef HOME cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl; #endif return 0; }
相关文章推荐
- [HAOI2015]树上操作
- 关于UNION ALL与 UNION 用法和区别
- 循环和递归的异同
- iCloud De-duplication
- HashSet的对象必须实现hashCode()和equals()
- Shader入门指南【2】
- java基础之集合框架——Collections-同步和非同步
- DP经典 之 CODE[VS] 1576 最长严格上升子序列 (O(n^2) 和 O(nlogn))
- struts开发环境配置
- 12硬币中有一个不知道轻重的假币,用天平将它找出来
- hibernate开发几个提示!
- Google C++ Style Guide的哲学
- QT5 学习之路04---QT5基本对话框1
- 样式浅谈2
- Java处理双引号
- 学习笔记 - java FileWriter对文本文件的写入
- CF581C:Developing Skills解题报告
- JAVA验证字符串长度(包括汉字)
- kmeans聚类的实现
- 【Android】Android之Activity的生命周期