– Để lưu trữ một đa thức ta chỉ cần lưu các hệ số (bằng một mảng)và bậc của đa thức.
– Các phép toán đối với một đa thức gồm cộng, trừ, nhân, chia hai đa thức.
– Việc tính giá trị đa thức tại một giá trị của biến được thực hiện thông qua lược đồ hooc nơ hoặc tính trực tiếp.
Bài tập 1: Viết chương trình cho phép cộng hai đa thức. Kết quả in ra dạng:
anx^n + … + a1x + a0
Giải thuật:
– Dùng hai mảng A, B để lưu hệ số của hai đa thức. Có thể dùng mảng thứ ba C hoặc dùng lại một trong hai mảng A, B để lưu hệ số của đa thức tổng.
– Khi in kết quả cần kiểm tra hệ số để in dấu cho đúng.
Program Cong_da_thuc;
uses crt;
Type KM = array[0..10] of integer;
Var A,B: KM;
n: byte;
Procedure NhapDT(Var A: KM; n:byte);
Var i: byte;
Begin
For i:=n downto 0 do
Begin Write('M[',i,']='); Read(A[i]); End;
End;
Procedure CONG(Var A:KM;B:KM;n:byte);
Var i: byte;
Begin
For i:= 0 to n do A[i]:=A[i]+B[i];
End;
Procedure INDT(A:KM;n:byte);
Var i: byte;
Begin
if A[n] <> 0 then Write(A[n],'x^',n);
For i:=n-1 downto 0 do
if A[i] <> 0 then
if A[i] < 0 then write(A[i],'x^',i) else Write('+',A[i],'x^',i);
End;
Begin
clrscr;
Write('Nhap bac n: ');Readln(n);
Writeln('Nhap da thuc A: '); NhapDT(A,n);
Writeln('Nhap da thuc B: '); NhapDT(B,n);
clrscr;
Indt(A,n); Writeln;
Indt(B,n); Writeln;
Cong(A,B,n);
Writeln('Da thuc tong: ');
Indt(A,n);
Readln;
Readln
End.
Bài tập 2: Viết chương trình cho phép tính giá trị của đa thức A(x) tại giá trị x = x0.
Giải thuật:
– Dùng chương trình con để tính xn.
Program Gia_tri_cua_da_thuc;
Var n,i: integer;
x,a,s:real;
Function XMU(x:real; n:integer):real;
Var i: integer;
Mu: real;
Begin
Mu:=1;
For i:=1 to n do Mu:=Mu*x;
XMU:=Mu;
End;
Begin
Write('Nhap bac cua da thuc n = '); Readln(n);
Write('Tinh f(x) tai x = ');Readln(x);
S:=0;
For i:=n downto 0 do
Begin
Write('a',i,'= '); Readln(a);
S:=S+a*XMU(x,i);
End;
Writeln('F(',x:5:2,')= ',S:5:2);
Readln;
End.
Bài tập 3: Viết chương trình tính giá trị của đa thức A(x) với điều kiện không dùng biến mảng.
Viết chương trình tính giá trị của đa thức f(x) = anxn + … +a1x + a0 tại x = x0.
Thuật toán:
f(x) = anxn + … +a1x + a0 = a0 + x(a1 + x(a2 + … x(an-1 + x(an))…))
Lặp lại việc: Đọc và cộng hệ số rồi nhân với x từ hệ số an đến hệ số a0.
Program Gia_tri_da_thuc;
Var S,a,x: real;
n,i: byte;
Begin
Write('Nhap bac cua da thuc. n = '); Readln(n);
Write('Tinh f(x) tai x = ');Readln(x);
S:=0;
For i:= n downto 0 do
Begin
Write('a',i,'=');Readln(a);
S:=(S+a)*x;
End;
Write('f(',x:3:1,')=',S:5:1);
Readln
End.
Bài tập 4: Viết chương trình cho phép nhân hai đa thức đã sắp xếp.
Thuật toán: Tích đa thức A bậc m với đa thức B bậc n là đa thức C bậc m + n. Trong đó: C[m] = Tổng của các tích A[i] * A[j] sao cho i+j = m.
Program Nhan_da_thuc;
Var m,n,i,j:byte;
A, B, C: array[0..10] of real;
Begin
Write(' Nhap bac cua da thuc A: '); Readln(m);
For i:= m downto 0 do
Begin
Write('A[',i,']= '); Readln(A[i]);
End;
Write(' Nhap bac cua da thuc B: '); Readln(n);
For i:= n downto 0 do
Begin
Write('B[',i,']= '); Readln(B[i]);
End;
For i:=0 to m+n do C[i]:=0;
For i:=0 to m do
For j:=0 to n do C[i+j]:=C[i+j]+A[i]*B[j];
For i:= m+n downto 0 do if C[i]<>0 then Write(C[i]:3:1,'x^',i,' + ');
Readln
End.
Bài tập 5: Viết chương trình cho phép chia hai đa thức để tìm đa thức thương và đa thức dư.
Program Chia_da_thuc;
uses crt;
Type KM = array[0..10] of real;
Var A,B,C,AB,D: KM;
i,n,cs,bc: byte;
Procedure NhapDT(Var A: KM; n:byte);
Var i: byte;
Begin
For i:=n downto 0 do
Begin Write('M[',i,']='); Read(A[i]); End;
End;
Function BAC(A:KM;n:integer):Byte;
Var i:Byte;
Begin
i:=n;
While (A[i]=0) and (i> 0) do i:=i-1;
BAC:=i;
End;
Procedure TRU(Var A:KM;B:KM;n:byte);
Var i: byte;
Begin
For i:= 0 to n do A[i]:=A[i]-B[i];
End;
Procedure NHAN(Var C:KM;A,B:KM; Var n:byte);
Var i,j:byte;
TAM:KM;
Begin
n:=Bac(A,n)+Bac(B,n);
For i:= 0 to 2*n do TAM[i]:=0;
For i:= 0 to n do
For j:=0 to n do TAM[i+j]:=TAM[i+j]+A[i]*B[j];
For i:=0 to 2*n do C[i]:=TAM[i];
End;
Procedure INDT(A:KM;n:byte);
Var i: byte;
Begin
if A[n] <> 0 then Write(A[n]:3:1,'x^',n);
For i:=n-1 downto 0 do
if A[i] <> 0 then
if A[i] < 0 then write(A[i]:3:1,'x^',i)
else Write('+',A[i]:3:1,'x^',i);
End;
Procedure DT_BAC(Var A:KM;Bac:byte;gt:real);
Var i:byte;
Begin
For i:=1 to n do A[i]:=0;
A[Bac]:=gt;
End;
Begin
clrscr;
Write('Nhap bac cua da thuc bi chia: ');Readln(n);
Writeln('Nhap da thuc A: '); NhapDT(A,n);
Writeln('Nhap da thuc B: '); NhapDT(B,n);
clrscr;
Write('Da thuc bi chia: ');Indt(A,n); Writeln;
Write('Da thuc chia: ');Indt(B,n); Writeln;
bc:=Bac(A,n)-Bac(B,n); {Luu bac cua da thuc C}
For i:=1 to bc do C[i]:=0;
While BAC(A,n) >= BAC(B,n) do
Begin
cs:=BAC(A,n)-BAC(B,n);
C[cs]:=A[Bac(A,n)]/B[Bac(B,n)];
Writeln('C[',cs,']=',C[cs]:3:1);
DT_BAC(D,cs,C[cs]);Writeln;
Write('Da thuc D:');
Indt(D,n);
NHAN(AB,B,D,n);Writeln;
Write('Da thuc AB:');
Indt(AB,n);Writeln;
TRU(A,AB,n);
Write('Da thuc A moi:');
Indt(A,n);
End;
Writeln('Da thuc thuong: ');
Indt(C,bc);
Readln;
Readln
End.