Trợ giúp về tìm giá trị đa thức tại điểm z bằng phương pháp Horner

Với x(0) = 0, x(1) = 1, y(0) = 1, y(1) = -1 khi bậc n = 1, ta đc đa thức là P(z) = -2z+1, e có giải tay theo Horner thì P(z) tại z = 2 là -3 nhưng khi code thì kết quả bị sai. Mọi người cho e hỏi là e sai ở chỗ nào và cách sửa như thế nào với ạ.

#include <iostream>
using namespace std;


void giaiHPT(int a1,int b1,int c1,int a2,int b2,int c2){
	 // a1x+b1y = c1
	cout << endl ;
    cout << "Nhap he so a1 " << endl ; 
    cin >> a1 ;
    cout << "Nhap he so b1" << endl ;
    cin >> b1 ;
    cout << "Nhap he so c1" << endl ;
    cin >> c1;
    // a2x+b2y = c2
    cout << "Nhap he so a2" << endl ;
    cin >> a2 ;
    cout << "Nhap he so b2" << endl ;
    cin >> b2 ;
    cout << "Nhap he so c2" << endl;
    cin >> c2 ;
    float D,Dx,Dy;
    D = a1*b2 - a2*b1 ;
    Dx = c1*b2 - c2*b1;
    Dy = a1*c2 - a2*c1;
    if (D == 0){
        if(Dx+Dy == 0)
            cout << "He phuong trinh co vo so nghiem" << endl;
            else cout << "He phuong trinh vo nghiem" << endl;
        }
        else {
            int x = Dx/D ;
            int y = Dy/D ;
            cout << "He phuong trinh co nghiem " << endl ;
            cout << "X = " << x << endl;
            cout << "Y = " << y << endl ;
            cout << "Ta co da thuc P(z) la: " << x << "z + " << y ;
        }
    }
    
    int Horner(int* a, int n, int z)  // gia tri tai diem z = 
{
    int result = a[n];
    for (int i = n - 1; i >= 0; --i)
        result = result * z + a[i];
    return result;
}

int main()
{
	float z ;
	int a1,b1,c1,a2,b2,c2 ;
    int n;
    cout << "Nhap so bac cua da thuc: ";
    cin >> n;
	int a[n];
    int *y = new int[n]; // tao mang y bang cap phat dong

    for (int i = 0; i <= n; i++)
    {
        cout << "Nhap gia tri y(" << i << "): ";
        cin >> y[i];
    }

    int *x = new int[n];
    for (int i = 0; i <= n; i++)
    {
       cout << "Nhap gia tri x(" << i << "): ";
       cin >> x[i];
    }

    
    cout << endl;
    cout << "X\t\tY" << endl;
    for(int i = 0; i <= n ;i++){
    	cout << x[i] << "\t\t" << y[i] << endl;
	}
	
	if(n == 0){
		for(int i = 0; i <= n;i ++)
		cout << "Da thuc P(z) co dang la: a0 = y = " << y[i] ;
	}
	else if(n == 1){
		for(int i = 0; i < n; i++)
		cout << "Da thuc P(z) di qua 2 diem co dang la: a1z^1 + a0 = P(z) = y" << endl ; 
		cout << "Ta co HPT tuong ung:" << endl;
		for(int i = 0; i < n; i++)
		cout << "1. " << x[i] << "a1 + " << "b1" <<  " = " << y[i] << endl;
		for(int i = 0; i < n; i++)
		cout << "2. " << x[i]+1 << "a2 + " << "b2" <<" = " << y[i+1] ;
		giaiHPT(a1,b1,c1,a2,b2,c2);
		cout << " Nhap gia tri tai z = ";
		cin >> z;
		int p = Horner(a,n,z);
		cout << "P(" << "z) "  << " = " << p << endl; 
	}
	else if (n == 2){
		cout << "Da thuc P(z) di qua 3 diem co dang la: a2z^2 + a1z^1 + a0";
	}
	cout << endl;
	//bieuthuc();
	cout << endl;
	delete[] x ;
    delete[] y ; // giai phong vung nho da cap phat dong
    return 0;
}

ở đây Dx/x là float mà gán = int thì nó bị mất phần thập phân đi mất :V

y trỏ tới mảng có n phần tử thì ko truy cập được y[n] nha, chỉ truy cập được y[0] tới y[n-1] thôi. Vòng for ghi i <= n là sai nha

cái này là VLA (Variable-length array) là code C chứ ko phải là code C++ nha :V Hiện tại mới học ko sửa cũng được nhưng chuyển qua Visual Studio là nó báo lỗi đó :V

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