Untitled
unknown
plain_text
a year ago
12 kB
6
Indexable
#include <iostream> #include <string> #include <stack> using namespace std; // Hàm chuyển chuỗi số vào stack stack<int> ChuyenDoi(string str) { stack<int> t; // tạo một stack để lưu for(int i = 0; i < str.size(); i++) { t.push(int(str[i]) - 48); // Chuyển ký tự số thành số nguyên và đẩy vào stack } return t; // trả về stack chứa các số nguyên } int main() { stack<int> a; stack<int> b; stack<int> result; // stack kết quả string a_, b_; cout << "Nhập số nguyên lớn a: "; getline(cin, a_); cout << "Nhập số nguyên lớn b: "; getline(cin, b_); a = ChuyenDoi(a_); b = ChuyenDoi(b_); int mem = 0, s; // mem là số nhớ, s là tổng hai số // Khi một trong hai stack còn số để cộng while(!a.empty() || !b.empty() || mem != 0) { s = mem; // khởi tạo s bằng số nhớ if(!a.empty()) { s += a.top(); // cộng thêm phần tử từ stack a nếu còn a.pop(); } if(!b.empty()) { s += b.top(); // cộng thêm phần tử từ stack b nếu còn b.pop(); } if(s >= 10) // nếu tổng lớn hơn hoặc bằng 10 { mem = 1; // cập nhật số nhớ s %= 10; // lấy phần đơn vị của tổng } else { mem = 0; // không có số nhớ } result.push(s); // lưu kết quả vào stack kết quả } // In kết quả while(!result.empty()) { cout << result.top(); result.pop(); } cout << endl; return 0; } #include <bits/stdc++.h> using namespace std; // Hàm trừ hai số nguyên lớn string Sub(string a, string b) { // Đảm bảo độ dài hai chuỗi bằng nhau while (a.size() < b.size()) a = "0" + a; while (a.size() > b.size()) b = "0" + b; bool ok = false; // Nếu a nhỏ hơn b, hoán đổi và đánh dấu để thêm dấu âm cho kết quả if (a < b) { a.swap(b); ok = true; } int nho = 0; string res = ""; int len = a.size() - 1; for (int i = len; i >= 0; i--) { int so = int(a[i] - '0') - int(b[i] - '0') - nho; if (so < 0) { so += 10; nho = 1; } else { nho = 0; } res = char(so + '0') + res; } // Xoá các số 0 ở đầu kết quả while (res[0] == '0' && res.length() > 1) res.erase(res.begin()); // Thêm dấu âm nếu a < b if (ok) res = "-" + res; return res; } int main() { string a, b; cout << "Nhập số nguyên lớn thứ nhất: "; cin >> a; cout << "Nhập số nguyên lớn thứ hai: "; cin >> b; cout << "Kết quả: " << Sub(a, b) << '\n'; return 0; } #include <bits/stdc++.h> using namespace std; typedef long long ll; // Hàm nhân số lớn với số nhỏ string small_mul(string a, int k) { ll carry = 0, sum; string ans = a; for (int i = a.size() - 1; i >= 0; i--) { sum = (a[i] - '0') * k + carry; carry = sum / 10; ans[i] = (sum % 10 + '0'); } while (carry != 0) { ans = char(carry % 10 + '0') + ans; carry /= 10; } while (ans.size() > 1 && ans[0] == '0') { ans.erase(0, 1); } return ans; } int main() { string a; int k; cout << "Nhap so nguyen lon a: "; cin >> a; cout << "Nhap so nguyen nho k: "; cin >> k; string result = small_mul(a, k); cout << "Ket qua phep nhan a * k: " << result << endl; return 0; } #include <bits/stdc++.h> using namespace std; typedef long long ll; // Thuật toán nhân với số nhỏ string small_mul(string a, int k) { ll carry = 0, sum; string ans = a; for (int i = a.size() - 1; i >= 0; i--) { sum = (a[i] - '0') * k + carry; carry = sum / 10; // Đối với nhân thì nhớ có thể lên đến 8 ans[i] = (sum % 10 + '0'); } while (carry != 0) { ans = char(carry % 10 + '0') + ans; carry /= 10; } while (ans.size() > 1 && ans[0] == '0') ans.erase(0, 1); return ans; } // Thuật toán cộng hai số string add_num(string a, string b) { ll carry = 0, sum; string ans; // Đảm bảo cả hai chuỗi có độ dài bằng nhau bằng cách thêm các chữ số 0 vào đầu chuỗi ngắn hơn while (a.size() < b.size()) a = '0' + a; while (b.size() < a.size()) b = '0' + b; ans = a; for (int i = a.size() - 1; i >= 0; i--) { sum = (a[i] - '0') + (b[i] - '0') + carry; // - ‘0’ để chuyển từ chuỗi sang số carry = sum / 10; ans[i] = (sum % 10) + '0'; // + ‘0’ để chuyển từ số sang chuỗi } if (carry == 1) ans = '1' + ans; // Nếu nhớ = 1 thì thêm ‘1’ vào trước ans return ans; } // Hàm tính toán nhân 2 số nguyên lớn thông qua 2 hàm trên string big_mul(string a, string b) { string ans = "0", bx; int tight = 0; for (int i = b.size() - 1; i >= 0; i--) { bx = small_mul(a, b[i] - '0'); bx.insert(bx.size(), tight, '0'); ++tight; ans = add_num(ans, bx); } return ans; } int main() { string a, b; cout << "Nhap so nguyen lon a: "; cin >> a; cout << "Nhap so nguyen lon b: "; cin >> b; string result = big_mul(a, b); cout << "Ket qua phep nhan a * b: " << result << endl; return 0; } #include <bits/stdc++.h> using namespace std; // Hàm chia nguyên số nguyên lớn với số nguyên nhỏ, trả về số nguyên lớn string thuong1(string a, long long b) { string kq = ""; long long sbc = 0, thuong = 0; long long k = a.length(); for (long long i = 0; i < k; i++) { sbc = sbc * 10 + (a[i] - '0'); thuong = sbc / b; sbc = sbc % b; kq += char(thuong + '0'); } while (kq[0] == '0' && kq.length() > 1) { kq.erase(0, 1); } return kq; } // Hàm tính phần dư của phép chia long long phan_du(string a, long long b) { long long sbc = 0; long long k = a.length(); for (long long i = 0; i < k; i++) { sbc = sbc * 10 + (a[i] - '0'); sbc = sbc % b; } return sbc; } int main() { string x; cout << "Nhập số nguyên lớn: "; cin >> x; long long y; cout << "Nhập số nguyên nhỏ: "; cin >> y; string c = thuong1(x, y); long long remainder = phan_du(x, y); cout << "Thương: " << c << endl; cout << "Phần dư: " << remainder << endl; return 0; } #include <bits/stdc++.h> using namespace std; // Hàm cộng hai số nguyên lớn string cong(string a, string b) { string kq = ""; int so1, so2, so, du, nho = 0; while (a.length() < b.length()) a = "0" + a; while (a.length() > b.length()) b = "0" + b; int k = a.length(); for (int i = k - 1; i >= 0; i--) { so1 = a[i] - '0'; // chuyển kí tự a[i] thành số so2 = b[i] - '0'; // chuyển kí tự b[i] thành số so = so1 + so2 + nho; if (so >= 10) { du = so % 10; nho = so / 10; } else { du = so; nho = 0; } kq = char(du + '0') + kq; } if (nho > 0) kq = "1" + kq; return kq; } // Hàm so sánh hai số nguyên lớn int sosanh(string a, string b) { while (a.length() < b.length()) a = "0" + a; while (a.length() > b.length()) b = "0" + b; if (a == b) return 0; if (a > b) return 1; return -1; } // Hàm trừ hai số nguyên lớn string tru(string a, string b) { string kq = ""; int so, so1, so2, muon = 0; while (a.length() < b.length()) a = "0" + a; while (a.length() > b.length()) b = "0" + b; int k = a.length(); for (int i = k - 1; i >= 0; i--) { so1 = a[i] - '0'; // chuyển kí tự a[i] thành số so2 = b[i] - '0'; // chuyển kí tự b[i] thành số if (so1 < so2 + muon) { so1 += 10; so = so1 - so2 - muon; muon = 1; } else { so = so1 - so2 - muon; muon = 0; } kq = char(so + '0') + kq; } while (kq[0] == '0' && kq.length() > 1) kq.erase(0, 1); return kq; } // Hàm tính thương nguyên của hai số nguyên lớn string thuong2(string a, string b) { string kq = "", hold = ""; long long k; string kb[11]; kb[0] = "0"; for (int i = 1; i <= 10; i++) kb[i] = cong(kb[i - 1], b); for (long long i = 0; i < a.length(); i++) { hold = hold + a[i]; k = 1; while (sosanh(hold, kb[k]) != -1) k++; kq = kq + char(k - 1 + '0'); hold = tru(hold, kb[k - 1]); } while (kq[0] == '0' && kq.length() > 1) kq.erase(0, 1); return kq; } int main() { string x, y; cout << "Nhập số nguyên lớn thứ nhất: "; cin >> x; cout << "Nhập số nguyên lớn thứ hai: "; cin >> y; string c = thuong2(x, y); cout << "Thương: " << c << endl; return 0; } #include <bits/stdc++.h> using namespace std; // Hàm cộng hai số nguyên lớn string cong(string a, string b) { string kq = ""; int so1, so2, so, du, nho = 0; while (a.length() < b.length()) a = "0" + a; while (a.length() > b.length()) b = "0" + b; int k = a.length(); for (int i = k - 1; i >= 0; i--) { so1 = a[i] - '0'; // chuyển kí tự a[i] thành số so2 = b[i] - '0'; // chuyển kí tự b[i] thành số so = so1 + so2 + nho; if (so >= 10) { du = so % 10; nho = so / 10; } else { du = so; nho = 0; } kq = char(du + '0') + kq; } if (nho > 0) kq = "1" + kq; return kq; } // Hàm so sánh hai số nguyên lớn int sosanh(string a, string b) { while (a.length() < b.length()) a = "0" + a; while (a.length() > b.length()) b = "0" + b; if (a == b) return 0; if (a > b) return 1; return -1; } // Hàm trừ hai số nguyên lớn string tru(string a, string b) { string kq = ""; int so1, so2, so, muon = 0; while (a.length() < b.length()) a = "0" + a; while (a.length() > b.length()) b = "0" + b; int k = a.length(); for (int i = k - 1; i >= 0; i--) { so1 = a[i] - '0'; // chuyển kí tự a[i] thành số so2 = b[i] - '0'; // chuyển kí tự b[i] thành số if (so1 < so2 + muon) { so1 += 10; so = so1 - so2 - muon; muon = 1; } else { so = so1 - so2 - muon; muon = 0; } kq = char(so + '0') + kq; } while (kq[0] == '0' && kq.length() > 1) kq.erase(0, 1); return kq; } // Hàm tính dư của hai số nguyên lớn string chiadu2(string a, string b) { long long i, k; string hold = ""; // hold là biến lưu trữ tạm thời số bị chia theo từng lần string kb[11]; kb[0] = "0"; for (i = 1; i <= 10; i++) kb[i] = cong(kb[i - 1], b); for (i = 0; i < a.length(); i++) { hold = hold + a[i]; k = 1; while (sosanh(hold, kb[k]) != -1) k++; hold = tru(hold, kb[k - 1]); } return hold; } int main() { string a, b; cout << "Nhập số nguyên lớn thứ nhất: "; cin >> a; cout << "Nhập số nguyên lớn thứ hai: "; cin >> b; string result = chiadu2(a, b); cout << "Dư: " << result << endl; return 0; }
Editor is loading...
Leave a Comment