fork download
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3.  
  4. using namespace std;
  5.  
  6. // thuật toán áp dụng cho lấy số lớn hơn trừ số nhỏ hơn
  7. // nếu muốn lấy số nhỏ trừ số lớn thì đổi thứ tự xâu và đổi dấu kết quả
  8. string sub(string a, string b) {
  9. // cân bằng độ dài 2 xâu để dễ xử lí
  10. reverse(a.begin(), a.end());
  11. reverse(b.begin(), b.end());
  12. while (a.size() < b.size()) a += '0';
  13. while (b.size() < a.size()) b += '0';
  14.  
  15. int r = 0; // số dư
  16. string ans = ""; // kết quả
  17. for (int i = 0; i < a.size(); i++) {
  18. int d = (a[i] - '0') - (b[i] - '0') - r; // hiệu từng cặp chữ số từ phải sang trái và thêm nhớ
  19.  
  20. // tính toán biến nhớ
  21. if (d < 0) r = 1, d += 10;
  22. else r = 0;
  23.  
  24. ans += (char)(d + '0'); // thêm số vừa tính được vào kết quả
  25. }
  26.  
  27. reverse(ans.begin(), ans.end()); // đưa kết quả về đúng thứ tự
  28. while (ans.size() > 1 && ans[0] == '0') ans.erase(0, 1); // xóa những số 0 vô nghĩa
  29.  
  30. return ans; // trả về kết quả
  31. }
  32.  
  33. signed main() {
  34. ios_base::sync_with_stdio(0);
  35. cin.tie(0); cout.tie(0);
  36.  
  37. string a, b; cin >> a >> b; // nhập dữ liệu
  38.  
  39. // kiểm tra số âm
  40. int minus = 1, pos = 1;
  41. if (a[0] == '-' || a == "0") pos &= 0, minus ^= 1, a.erase(0, 1);
  42. if (b[0] == '-' || b == "0") pos &= 0, minus ^= 1, b.erase(0, 1);
  43.  
  44. if (!minus) cout << "use addition" << '\n'; // nếu 2 số trái dấu thì dùng phép cộng
  45.  
  46. // xuất dữ liệu
  47. else if (!pos) cout << '-' << sub(a, b) << '\n';
  48. else cout << sub(a, b) << '\n';
  49. return 0;
  50. }
Success #stdin #stdout 0.01s 5292KB
stdin
Standard input is empty
stdout