【问题标题】:Determining the number of terms in the result of the multiplication of two polynomials确定两个多项式相乘结果中的项数
【发布时间】:2015-10-03 16:50:23
【问题描述】:

这是一个 c++ 程序,它对多项式执行不同的运算。在这个程序中,multiplication() 函数存在逻辑问题。我无法计算出结果多项式中的项数,这是两个多项式相乘的结果。

这个程序在大多数情况下都给出了正确的乘法输出,但也有少数情况下没有正确执行乘法运算。以下是完整的程序。

#include<iostream>
using namespace std;

struct poly
{
    int coef, pow;
};

int k=0;
poly* getdata(poly *a,int n)
{
    for(int i=0; i<n; i++)
    {
        cout<<"\n Enter the coefficient and power of the term";
        cin>>a[i].coef>>a[i].pow;
    }
    return a;
}

poly* add(poly *c, poly *a, poly *b, int n1, int n2)
{
    int i=0, j=0;
    while(i<n1 && j<n2)
    {
        if(a[i].pow<b[j].pow)
        {
            c[k].pow = a[i].pow;
            c[k].coef = a[i].coef;
            i++;
            k++;
        }
        else if(a[i].pow == b[j].pow)
        {
            c[k].pow = a[i].pow;
            c[k].coef = a[i].coef+b[j].coef;
            i++; j++; k++;
        }
        else
            //(a[i].pow > b[j].pow)
        {
            c[k].pow = b[j].pow;
            c[k].coef = b[j].coef;
            j++; k++;
        }
    }
    while(i<n1)
    {
        c[k].pow = a[i].pow;
        c[k].coef = a[i].coef;
        i++;
        k++;
    }
    while(j<n2)
    {
        c[k].pow = b[j].pow;
        c[k].coef = b[j].coef;
        j++; k++;
    }
    return c;
}

void display(poly *p,int n)
{
    int i;
    cout<<"\n The polynomial is :-\n";
    for(i=0; i<n-1; i++)
    {
        cout<<p[i].coef<<"x^"<<p[i].pow<<"+";
    }
    cout<<p[i].coef<<"x^"<<p[i].pow;
    cout<<endl;
}

void multiplication(poly *c, poly *a, poly* b, int n1, int n2)
{
    int i, j;
    //int count = 0;

    for(i=0; i<n1*n2; i++)
    {
        c[i].coef = 0;
        c[i].pow = 0;
    }

    for(i=0; i<n1; i++)
    {
        for(j=0; j<n2; j++)
        {
            c[i+j].coef = a[i].coef*b[j].coef + c[i+j].coef;
            c[i+j].pow = a[i].pow + b[j].pow;
        }
    }
    //return count;
}

int main()
{
    poly a[10], b[10], c[10];
    poly *p, *q , *result;
    int n1, n2;
    cout<<"\n Enter the number of terms in polynomial 1 : ";
    cin>>n1;
    p = getdata(a,n1);
    display(p, n1);

    cout<<"\n Enter the number of terms in polynomial 2 : ";
    cin>>n2;
    q = getdata(b,n2);
    display(q, n2);

    result = add(c, a, b, n1, n2);
    cout<<"\n The Sum of the two polynomial is ";
    display(result, k);

    poly *mresult;
    mresult = new poly[n1+n2];
    multiplication(mresult, a, b, n1, n2);
    cout<<"\n The Multiplication of the two polynomials is :- ";
    display(mresult,n1+n2-1);

    return 0;
}

在少数情况下的输出:-

 Enter the number of terms in polynomial 1 : 2

 Enter the coefficient and power of the term1
1

 Enter the coefficient and power of the term3
9

 The polynomial is :-
1x^1+3x^9

 Enter the number of terms in polynomial 2 : 2

 Enter the coefficient and power of the term1
3

 Enter the coefficient and power of the term2
6

 The polynomial is :-
1x^3+2x^6

 The Sum of the two polynomial is 
 The polynomial is :-
1x^1+1x^3+2x^6+3x^9

 The Multiplication of the two polynomials is :- 
 The polynomial is :-
1x^4+5x^12+6x^15

这是正确的。 但是考虑一下这种情况:-

 Enter the number of terms in polynomial 1 : 2

 Enter the coefficient and power of the term1
1

 Enter the coefficient and power of the term3
9

 The polynomial is :-
1x^1+3x^9

 Enter the number of terms in polynomial 2 : 2

 Enter the coefficient and power of the term1
3

 Enter the coefficient and power of the term2
6

 The polynomial is :-
1x^3+2x^6

 The Sum of the two polynomial is 
 The polynomial is :-
1x^1+1x^3+2x^6+3x^9

 The Multiplication of the two polynomials is :- 
 The polynomial is :-
1x^4+5x^12+6x^15

这是错误的。这里的乘法应该是:-x^4+2x^7+3x^12+6x^15

还有一些我尝试过的逻辑,例如:-

int multiplication(poly *c, poly *a, poly* b, int n1, int n2)
{
    int i, j;
    int count = 0;

    for(i=0; i<n1*n2; i++)
    {
        c[i].coef = 0;
        c[i].pow = 0;
    }

    for(i=0; i<n1; i++)
    {
        for(j=0; j<n2; j++)
        {
            c[count].coef = a[i].coef*b[j].coef + c[count].coef;
            c[count].pow = a[i].pow + b[j].pow;
            if(c[count].pow != c[count-1].pow) count++;
        }
    }
    return count;
}

此函数返回多项式 c 中的项数。

注意:- c 是两个多项式 a 和 b 相乘的结果。

【问题讨论】:

  • 您在多项式的表示中有一些明显的冗余。索引 K 处的项是否具有 K 以外的幂?
  • 尝试将其视为首先为原始多项式项的每个组合添加一个项。一旦你完成了这项工作,看看如何将具有相同功能的术语组合起来。
  • @Cheersandhth.-Alf 先生,我没听明白。我认为当然可能有几种情况,我的力量会有所不同。
  • @VaughnCato:先生,我也试过了。但我无法正确地做到这一点。我的第二个实施是实施你所说的。如果你能给出一个简短的算法。为此,我会感谢你。
  • 请停止使用“先生”

标签: c++ polynomial-math


【解决方案1】:

fgx的多项式时,f × g 是 f 的度数加上 g 的度数。结果多项式的系数将是几对乘积的总和; eg 当乘以 (f_2 x^2 + f_1 x + f_0)(g_2 x^2 + g_1 x + g_0) 时,x^2 的系数将为 f_2*g_0 + f_1*g_1 + f_0 *g_2。您不会事先知道这些总和是否为零。二项式 (x+1)(x+1) 有三个非零项,但 (x+1)(x-1) 有两个,而 (x^2+1)(x^4+x^3) 有四个.

您可以通过将其系数求和到一个向量中来有效地计算该多项式,该向量的索引是每个项的次数。当您转换回来时,您可以消除与零相同的项。

【讨论】:

    【解决方案2】:

    你想要更像这样的逻辑:

    for(i=0; i<n1; i++)
    {
        for(j=0; j<n2; j++)
        {
            int coef = a[i].coef * b[j].coef;
            int pow = a[i].pow + b[j].pow;
            count = add_term_to(c,count,coef,pow);
        }
    }
    

    现在您只需要实现add_term_to(),这样它就可以结合具有相同功效的术语。

    【讨论】:

    • 感谢您告诉我问题的前景,但主要思想在于函数 add_term_to(c, count, coef, pow) 的定义。我试图做同样的事情,但没有使用该功能。因此,如果您可以在函数体中添加一些内容,那么我认为它可能对我完全有帮助。
    • @AryanKhan:你只需要看看是否已经有一个具有相同权力的术语。如果是,则将系数添加到现有项中,否则添加新项。
    • 我实现了这个:- 对吗? int add_term_to(poly* c, int coef, int pow, int count) { c[count].coef += coef; c[计数].pow = pow; if(c[count].pow != c[count-1].pow && c[count].coef !=0) { count++; } 返回计数; }
    • @AryanKhan:您假设如果有一个具有匹配能力的术语,它将在末尾,但这可能不是真的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多