c++ - 在 C++ 中评估基于矩阵的多项式的最佳方法

标签 c++ arrays constants multidimensional-array polynomial-math

全部。我正在尝试建立一个程序,根据 X 的用户输入来计算多项式。我想要的程序的另一部分是将这些多项式加在一起。我正在使用二维数组来执行此操作。您认为编写评估函数的最佳方式是什么。已经为此工作了几个小时,但我仍然不太确定该怎么做。提前致谢。

多项式.h

#ifndef POLYNOMIAL_H
#define POLYNOMIAL_H

#include <iostream>
using namespace std;

#define MAX 100

class Polynomial {
      friend ostream &operator<< (ostream &, const Polynomial &);
      public :
             Polynomial ();
             void enterTerms();
             int evaluate(Polynomial p, int x);
             Polynomial operator +(const Polynomial & );
      private :
             int terms[MAX][2]; //either static size(MAX rows) or use "new" for dynamic allocation
             int n; //number of terms
};             

#endif

多项式.cpp

#include "polynomial.h"

using namespace std;

ostream &operator<< (ostream & out, const Polynomial & p){
        for ( int i = 0 ; i < p.n ; i++ ){
            if ( i == p.n - 1 )//last term does not have + appended
                  out << p.terms[i][0] <<"x^"<<p.terms[i][1]<<endl;
            else
                  out << p.terms[i][0]<<"x^"<<p.terms[i][1]<<" + ";
        }
        return out;
}
Polynomial :: Polynomial(){
         for ( int i = 0; i < MAX; i++ ){
             terms[i][0] = 0;
             terms[i][1] = 0;  
         }           
}       
void Polynomial :: enterTerms(){//enterTerms() not in constructor so that no prompt for entering 
//terms while doing + - etc., they also produce Poylnomial instance (i.e. invoke constructor)
      int num;
      cout<<"enter number of terms in polynomial\n";
      cin >> num;
      n = num >= 0 ? num : 1;
      cout << "enter coefficient followed by exponent for each term in polynomial\n";
      for ( int i = 0; i < n ; i++)  
              cin >> terms[i][0] >> terms[i][1] ;
}
Polynomial Polynomial :: operator + ( const Polynomial & p ){
           Polynomial temp, sum;
           temp.n = n + p.n;
           int common = 0;

          // first write sum as concatenation of p1 and p2               
           for ( int i = 0 ; i < n ; i++ ){ 
                   temp.terms[i][0] = terms[i][0];
                   temp.terms[i][1] = terms[i][1];
           }
           //notice j and k for traversing second half of sum, and whole p2 resp
           for ( int j = n, k = 0; j < n + p.n, k < p.n ; j++, k++ ){  
                   temp.terms[j][0] = p.terms[k][0];
                   temp.terms[j][1] = p.terms[k][1];
           }
           for ( int l = 0; l < temp.n - 1 ; l++ ){ // 0 to 1 less than length
               for ( int m = l + 1 ; m < temp.n ; m++ ){ // 1 more than l to length,so that compared pairs are non redundant
                   if( temp.terms[l][1] == temp.terms[m][1] ){
                           common++;   //common terms reduce no. of terms in sum (see sum.n decl)
                           temp.terms[l][0] +=  temp.terms[m][0]; //coefficients added if exponents same
                           temp.terms[m][0] = 0;                
                   }  
               }
           } 
           sum.n = temp.n - common;  //if you place it above, common taken as 0 and sum.n is same as temp.n (logical error)         

           //just to debug, print temporary array
           cout << endl << temp;  

           for ( int q = 0, r = 0; q < temp.n; q++ ){
                    if ( temp.terms[q][0] == 0 )
                       continue;
                    else{
                         sum.terms[r][0] = temp.terms[q][0];
                         sum.terms[r][1] = temp.terms[q][1];
                         r++;
                    }
           }

           cout << endl << sum;
           return sum;
       }

int Polynomial :: evaluate(Polynomial p, int x)
{
    Polynomial terms;
    return 0;
}



int main()
{

    Polynomial p1 , p2;
    p1.enterTerms();
    p2.enterTerms();
    cout << "Please enter the value of x:" << endl;
    cin >> x;
    //evaluate(p1);
    //evaluate(p2);
    p1 + p2;
    system("PAUSE");
    //cin.get();
    return 1;
}

最佳答案

请考虑更简单的数据结构。一种常见的方法是使用单个数组,其中索引是 x 的幂。只在不存在此类术语的地方使用零。然后 x^3 + 2*x + 1 写成 {1, 2, 0, 1},因为没有 x^2。还要注意相反的顺序,因为 p[0] 代表 x^0。这极大地简化了加法等操作。

至于评价,想想方程就知道了。如果您的多项式是 x^2 + 3*x + 5,并且您想要计算 x=7,您会怎么做?从 0 次幂开始,将每一项累加到一个变量中。

关于c++ - 在 C++ 中评估基于矩阵的多项式的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19299969/

相关文章:

python - 将切片组合成多维切片以进行 numpy 数组切片

java - 将一维字符串数组转换为二维字符数组?

php - 已经在 php 中定义的常量

c - 处理函数内部的常量

c++ - OpenCV CUDA C++ C 图像灰色

c++ - Qt C++:全局对象与引用链

c++ - 在 C++1z 中声明友元模板类模板产生错误 : specialization of ‘template<class T> class A’ must appear at namespace

c++ - C++ 中最快的数组初始化

c++ - 如何为 const 模板参数定义复制构造函数?

c++ - C++0x什么时候发布?