Untitled

 avatar
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