Phép chia trong bigInt

em muốn làm một toán tử /= cho bigint

const BigInt & BigInt::operator/=(const BigInt & num2) {

    return *this;
}

thuật toán chia nó khó quá :frowning: không giống như toán nhân chỉ cần tạo vòng lặp cộng

thuật toán chia thì cần vòng lặp trừ nhưng lại vướng vào số dư, ví du như với 9 / 3 thì = 3 nhưng nếu là 9 / 4 = 2 dư 1

ai rành thì giúp em với

Hi Nguyễn Văn Khoa.
Xong phép nhân rồi a ?
Phép chia thì cứ áp dụng quy tắc chia số nhiều chữ số bình thường thôi. Hoặc thô thiển nhất là trừ liên tục.

Nếu là mình thì mình dùng phương pháp trừ liên tục rồi đếm số lần trừ, đến khi nào ra kết quả nhỏ hơn số chia thì đó là số dư.

mấy cái mà các anh nói em đều thử hết rồi nhưng bị vướng số dư nên không được, ví dụ như 10 / 2 thì sẽ là 5 nhưng nếu áp dụng loop trừ thì sẽ nhận được là 2

Đây là phép chia, còn phép dư thì đơn giản hơn nữa nhé :))

public BigInt operator /(BigInt1, BigInt2)
{
    BigInt Thuong = 0;
    while (BigInt1 >= BigInt2)
    {
        Thuong += 1;
        BigInt1 -= BigInt2;
    }
    return Thuong;
}

thế cho em xin luôn cái phép dư nhé :slight_smile:

const BigInt & BigInt::operator/=(const BigInt & num2) {
	BigInt Thuong(0);
	while (*this >= n2)
	{
		Thuong += 1;
		*this -= n2;
	}
	return Thuong;
}

cái này nếu dùng thì cho ra kết quả là 10 / 2 = 0; 9 / 2 = 1 :frowning:

trong C++ có khai báo operator /= à O_o
Mình tưởng khai báo /== là có /= chứ?

mà cái cú pháp lạ vậy?

phải liệt kê hết đó, nếu ko thì phải viết 1 cái struct rồi kế thừa từ struct đó để nó tự động đẻ ra mấy op còn lại

lạ ở chỗ nào vậy bạn

À, không có gì, tại mình chưa biết XD

cái của mình cũng dùng phương pháp của bạn sao nó lại ra số đầu tiên

const BigInt& BigInt::operator/=(const BigInt & n2) {
	BigInt result(*this);
	*this = 0;
	while (result >= n2)
	{
		*this += 1;
		result -= n2;
	}
	return *this;
}

cho mình hỏi cái này có vấn đề không ạ mình nhập 10000000000 / 50000000 = 28 nhưng tính đùng thì phải = 200
nhưng nếu nhập 987654321 / 123456789 = 8 thì lại tính đúng

Mình đọc code của bạn không hiểu gì sất :joy: mình làm bên C# nó đơn giản thế kia thôi :))
Nếu mà C# có thể overload /= thì sẽ thế này:

public void operator /=(ref BigInt SoBiChia, BigInt SoChia)
{
    BigInt Thuong = 0;
    while (SoBiChia >= SoChia)
    {
        Thuong += 1;
        SoBiChia -= SoChia;
    }
    SoBiChia = Thuong;
}

(Với điều kiện là đã định nghĩa các toán tử =, >=, +=, -= trước đó)

nó y chang à, sobichia là mình dùng pointer *this để xác định

nhưng cách này vẫn có lỗi mình cũng đã thử y chang cái của bạn là nhập:
10000000000 / 50000000 = 28 nhưng tính đùng thì phải = 200
nhưng nếu nhập 987654321 / 123456789 = 8 thì lại tính đúng

const BigInt& BigInt::operator/=(const BigInt & n2) {
	BigInt result(*this);
	*this = 0;
	while (result >= n2)
	{
		*this += 1;
		result -= n2;
	}
	return *this;
}

cho em hỏi cái này có vấn đề không ạ,
em nhập 10000000000 / 50000000 = 28 nhưng tính đùng thì phải = 200 nhưng nếu nhập 987654321 / 123456789 = 8 thì lại tính đúng

ai giup em doan nay voi

BigInt sao không chuyển về số hệ 2 để thao tác, thuật toán có sẵn hết rồi mà?

minh mo ra tu hom qua roi ban :joy:

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