Hỏi về cộng 2 số nguyên lớn và bigint

Em đang làm bài toán cộng 2 số nguyên lớn thì đọc trên mạng thấy dùng bigint và cách này rất ngắn. Ai giải thích hộ em bigint với code dùm 1 đoạn để e hiểu được không ạ ?

Cộng bằng tay thôi mà :smiley:

Dùng hex (cơ số 16) luôn vậy. Đặt tính: 0x2E8 + 0x4A79
i = 0: 8 + 9 + carry = 17, 17 - 16 = 1 viết 1 nhớ 1 :smiley:
i = 1: 0xE + 0x7 + carry = 22, 22 - 16 = 6, viết 6 nhớ 1

i = 3, 4 + carry = 4 viết 4.

Kết quả là 0x4D61.

4 Likes

Sử dụng kiểu dữ liệu int - long…
Ưu điểm là tính nhanh, nhược điểm là kích thước của chuỗi bit phải cố định và bằng 2^n

BigInt bản chất là string :joy:
Tính BigInt thì như con người theo cách bạn @rogp10 đưa ra nên muốn tính to bao nhiêu cũng được, chừng nào máy vẫn còn RAM và CPU

Và cơ số có thể lấy luôn là 2^32 :slight_smile:

string chỉ dùng để hiển thị thôi :slight_smile: bên trong vẫn có thể dùng uint32_t bt…

3 Likes

Bạn có ther dùng mảng(vector chẳng hạn) hoặc string. Mỗi phần tử sẽ là 1 chữ số. Lấy thêm một biến nữa để lưu dấu của nó. Vote dùng vector để không phải convert mỗi khi tính :slight_smile:
Chẳng hạn thế này:

struct BigInt{
    int sign;
    vector<int> val;
}

Như vậy, với phép cộng, trừ thì đơn giản rồi. Nhớ check dấu và xử lý trường hợp 2 số không bằng nhau là được.

Nếu dùng Java hay các ngôn ngữ bậc cao khác thì có thư viện BigInt rồi :smiley:

Một số code BigInt mình search cho bạn:

https://codeforces.com/blog/entry/16380

Mình có chia sẻ 1 solution giải quyết số nguyên lớn ở đây. Code này thì khá là tối ưu, nhưng bù lại để hiểu nó cũng tốn thời gian đấy :smiley:

3 Likes

C++ bigint thì GMP hoặc MPIR trên Windows thẳng tiến, nhưng mà chủ thớt chắc ko cần tới mấy thứ này :V

nên xài kèm với Boost.Multiprecision cho thân thiện. Muốn thử thì vào https://wandbox.org/ thêm compiler options -lgmp vào nữa là được.

Ví dụ tìm số Fibonacci thứ 10000:

#include <boost/multiprecision/gmp.hpp>
#include <iostream>

using BigInt = boost::multiprecision::mpz_int;

int main()
{
    BigInt a = 0;
    BigInt b = 1;
    for (int k = 2; k < 10000; ++k)
    {
        BigInt c = a + b;
        a = b;
        b = c;
    }
    std::cout << b << "\n";
}

xài y hệt int bình thường :V

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?