Tính Tổng / Hiệu / Tích / Thương 2 đa thức
Hi mọi người,
Mình có 1 đề bài như sau:
Nhập vào 2 đa thức rồi tính tổng, hiệu, tích, thương của
2 đa thức đó, kết quả trả về là 1 đa thức mới.Yêu cầu: Phải xuất ra đầy đủ định dạng của 1 đa thức.
ĐA THỨC CÓ DẠNG: a0 * x^0 + a1 * x^1 + a2 * x^2 + … + an * x^n
Dữ liệu trong đa thức sẽ có:
- Số bậc cao nhất của đa thức (n).
- Danh sách các hệ số của đa thức (từ a0 --> an).
Yêu cầu: Phải xuất ra theo đúng định dạng.
vd:
Đa thức 1: 1 + 2 * x^1 + 3 * x^2
Đa thức 2: 4 + 5 * x^1 + 6 * x^2 + 7 * x ^ 3
=> Đa thức 1 + Đa thức 2 = 5 + 7 * x^1 + 9 * x^2 + 7 * x^3
=> Đa thức 1 - Đa thức 2 = -3 - 3 * x^1 - 3 * x^2 - 7 * x^3
=> Đa thức 1 * Đa thức 2 = 4 + 13 * x^1 + 28 * x^2 + 34 * x^3 + 32 * x^4 + 21 * x^5.
=> Đa thức 1 / Đa thức 2: Tự nháp.
Tình hình là mình chỉ mới làm được mỗi phép Cộng và Trừ, còn Tích và Thương thì thấy nó hơi khó khó sao ấy. Nên phiền mọi người có thể cho mình 1 chút gợi ý về 2 phép Nhân và Chia được không ? Hoặc là cho mình 1 cái “sườn” code cũng được và giải thích … blah blah …
Đây là Source Code phép Cộng / Trừ 2 Đa thức: http://codepad.org/PTIFTOiO
/*
Bài 1: Nhập vào 2 đa thức rồi tính tổng, hiệu, tích, thương của
2 đa thức đó, kết quả trả về là 1 đa thức mới.
Yêu cầu: Phải xuất ra đầy đủ định dạng của 1 đa thức.
ĐA THỨC CÓ DẠNG: a0 * x^0 + a1 * x^1 + a2 * x^2 + ... + an * x^n
Dữ liệu trong đa thức sẽ có:
- Số bậc cao nhất của đa thức (n).
- Danh sách các hệ số của đa thức (từ a0 --> an).
*/
typedef struct dathuc DT;
struct dathuc
{
int bac;
double *heso;
};
std::istream& operator >> (std::istream &is, DT *x)
{
do
{
std::cout << "
Nhap so bac cua da thuc: ";
is >> x->bac;
if (x->bac < 1)
std::cout << "
So bac cua da thuc khong hop le.
";
} while (x->bac < 1);
std::cout << "
Nhap cac he so (a0 -> an):
";
x->heso = new double[x->bac + 1];
for (int i = 0; i <= x->bac; ++i)
{
std::cout << "
He so a" << i << ": ";
is >> x->heso[i];
}
return is;
}
std::ostream& operator << (std::ostream &os, DT *x)
{
int count = 0;
os << x->heso[0];
x->heso[1] < 0 ? os << " - " << x->heso[1] * -1 << " * x" : os << " + " << x->heso[1] << " * x";
for (int i = 2; i <= x->bac; ++i, ++count)
{
x->heso[i] < 0 ? os << " - " << x->heso[i] * -1 << " * x^" << i : os << " + " << x->heso[i] << " * x^" << i;
}
os << std::endl;
return os;
}
DT* Tong2DaThuc(DT *x, DT *y)
{
int Max = x->bac > y->bac ? x->bac : y->bac;
int Min = x->bac < y->bac ? x->bac : y->bac;
DT *kq = new DT;
kq->bac = Max;
kq->heso = new double[kq->bac + 1];
for (int i = 0; i <= Min; ++i)
{
kq->heso[i] = x->heso[i] + y->heso[i];
}
if (Max == x->bac)
{
for (int i = Min + 1; i <= Max; ++i)
{
kq->heso[i] = x->heso[i];
}
}
else
{
for (int i = Min + 1; i <= Max; ++i)
{
kq->heso[i] = y->heso[i];
}
}
return kq;
}
DT* Hieu2DaThuc(DT *x, DT *y)
{
int Max = x->bac > y->bac ? x->bac : y->bac;
int Min = x->bac < y->bac ? x->bac : y->bac;
DT *kq = new DT;
kq->bac = Max;
kq->heso = new double[kq->bac + 1];
for (int i = 0; i <= Min; ++i)
{
kq->heso[i] = x->heso[i] - y->heso[i];
}
if (Max == x->bac)
{
for (int i = Min + 1; i <= Max; ++i)
{
kq->heso[i] = x->heso[i];
}
}
else
{
for (int i = Min + 1; i <= Max; ++i)
{
kq->heso[i] = 0 - y->heso[i];
}
}
return kq;
}
int main()
{
DT *x = new DT;
std::cout << "
------------ NHAP DA THUC 1 ------------
";
std::cin >> x;
std::cout << x;
DT *y = new DT;
std::cout << "
------------ NHAP DA THUC 2 ------------
";
std::cin >> y;
std::cout << y;
std::cout << "
----------------------------------------
";
std::cout << "
Tong 2 da thuc tren: " << Tong2DaThuc(x, y) << std::endl;
std::cout << "
Hieu 2 da thuc tren: " << Hieu2DaThuc(x, y) << std::endl;
delete x;
delete y;
system("pause");
return 0;
}
Cảm ơn mọi người nhiều nhé
Giải thích thì cũng khá loằng ngoằng, mình viết code bằng python rồi bạn có thể tìm hiểu trong đó.
Coi đa thức là một list
F(x) = sum ( f[i]*x^i ); i= 0 -> n-1
Python chắc em chịu anh ơi, em chỉ rành về C/C++ thôi chứ chẳng biết tẹo nào về python cả
cho code C++ chắc gì đã hiểu
http://rextester.com/ZEQEV88237
đa thức = tổng các đơn thức
bậc của đa thức là bậc của đơn thức có bậc lớn nhất
phép nhân đơn giản chỉ là 2 cái vòng for nhân các đơn thức với nhau nhau, rồi nhớ chỉnh bậc cho đúng: 2 đơn thức nhân với nhau tạo ra đơn thức mới, hệ số bằng tích 2 hệ số cũ, bậc bằng tổng 2 bậc cũ.
phép chia thì tính từ từ: lấy hệ số của đơn thức bậc cao nhất trong vế trái chia cho hệ số của đơn thức bậc cao nhất bên vế phải, ra được hệ số của 1 đơn thức trong thương (quotient), rồi phải lấy đa thức bị chia (dividend) trừ đi tích của đơn thức này với đa thức chia (divisor). Lập lại tới khi nào đa thức bị chia có bậc bé hơn đa thức chia là được. Lúc này đa thức bị chia chính là phần dư (remainder) của phép chia đa thức.
vd
7x3 + 6x2 + 5x + 4 chia 3x2 + 2x + 1
vì bậc của đa thức bị chia là 3 > bậc của đa thức chia là 2:
vì bậc của đa thức bị chia là 2 = bậc của đa thức chia là 2:
vì bậc của đa thức bị chia là 1 < bậc của đa thức chia là 2 => dừng. Kết quả thương là 7x/3 + 4/9, phần dư là 16x/9 + 32/9
Anh @tntxtnt code dễ hiểu tí được không nhỉ, em chưa học OOP, this, … này nọ cơ mà
Chỉ được dùng struct, con trỏ, mảng, … trở xuống thôi
tự viết đi, ko xài map cũng được, xài mảng lưu hệ số
coef
, vd đa thức bậc 10 thì xài mảng 11 phần tử:coef[0]
tương ứng với a0coef[1]
tương ứng với a1…
coef[10]
tương ứng với a10khi nhân 2 đa thức vd bậc 10 với bậc 3 thì kết quả là đa thúc bậc 13, nên tạo mảng hệ số 14 phần tử.
phép chia thì vd bậc 10 chia bậc 3 kết quả ra đa thức bậc 7, nên tạo mảng hệ số 8 phần tử, rồi chia dần dần theo cách chia tiểu học đó.
Great. Nhưng làm sao để tính ra từng phần tử anh?
VD: (2 + 3x)(4 + 5x + 6x^2)
Bây giờ mình muốn tính hạng tử bậc 2 chẳng hạn, thì phải nhân 2 với 6x^2, 3x với 5x. Nếu trường hợp đa thức đó dài ngoằn nghoèo nữa thì mình dùng thuật toán gì để tính nhỉ ?
Em mới làm được cái “khung” thôi
lấy giấy ra nhân đi sẽ thấy, đừng có lười
(5x3 + 4x2 + 3x + 2) * (7x2 + 8x + 9) = …
nhân lần lượt từng đơn thức với nhau sẽ thấy logic của phép nhân 2 đa thức thôi.
Uhm …
Đây là hàm tính tích 2 đa thức của em.
Nó chỉ đúng với 1 vài đa thức đơn giản, còn những đa thức phức tạp còn sai sót, mong anh @tntxtnt cố chiếu
Sao mà phức tạp thế
Em newbie nên code dài dòng lưa thưa lắm anh
Ôi thần linh ơi, tuyệt vời quá anh ! Cơ mà em chưa hiểu lắm về cái thuật toán anh dùng, anh có thể giải thích được không ạ ? Với cái hàm
fill
nữafill
chức năng trong này là gán tất cảheso=0
Khi nhân 2 đa thức aixi * bjxj = ai*bjxi+j . Kết quả của phép nhân là tổng của biểu thức trên nên kết quả
kq->heso[i+j] = sum(x->heso[i]*y->heso[j])
OK, sau 1 hồi suy ngẫm, em thấy cái chỗ hay nhất trong thuật toán của anh là chỗ này
Thanks anh nhiều !