01/10/2018, 09:19

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á 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

Tao Không Ngu. viết 11:21 ngày 01/10/2018

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.

Trần Hoàn viết 11:33 ngày 01/10/2018

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ư.

Nguyễn Văn Khoa viết 11:29 ngày 01/10/2018

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

Trần Hoàn viết 11:35 ngày 01/10/2018

Đâ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;
}
Nguyễn Văn Khoa viết 11:33 ngày 01/10/2018

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

Nguyễn Văn Khoa viết 11:29 ngày 01/10/2018
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

Trần Hoàn viết 11:33 ngày 01/10/2018

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?

viết 11:25 ngày 01/10/2018

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

Nguyễn Văn Khoa viết 11:26 ngày 01/10/2018

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

Trần Hoàn viết 11:24 ngày 01/10/2018

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

Nguyễn Văn Khoa viết 11:30 ngày 01/10/2018

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

Nguyễn Văn Khoa viết 11:26 ngày 01/10/2018
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

Trần Hoàn viết 11:20 ngày 01/10/2018

Mình đọc code của bạn không hiểu gì sất 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 đó)

Nguyễn Văn Khoa viết 11:27 ngày 01/10/2018

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

Nguyễn Văn Khoa viết 11:20 ngày 01/10/2018
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

kiencon viết 11:21 ngày 01/10/2018

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à?

Nguyễn Văn Khoa viết 11:23 ngày 01/10/2018

minh mo ra tu hom qua roi ban

Bài liên quan
0