Untitled
unknown
plain_text
2 years ago
12 kB
14
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