一元多项式用数组表示,只用表示非零项。每个非零项都包含指数和系数两部份,这样可以用结构数组来表示。
结构定义如下:
1 2 3 4 |
struct Poly{ int coef; //系数 int expon; //指数 }; |
写一段运用结构数组表示一元多项式,相加运算:
两个一元多项式:
f1(x) = 8x13+10X9+4x2
f2(x) = 8x18-2X9+4x+4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
// 梁笔记 // https://zouzhongliang.com #include <iostream> #include <ctime> using namespace std; struct Poly{ int coef; //系数 int expon; //指数 Poly(){ coef = 0; expon = 0; } }; void PolynomialAdd(Poly f[], Poly f1[], Poly f2[],int num1,int num2) { int i=0; int j=0; int k=0; while(i < num1 || j < num2){ if (i < num1 && j < num2){ if (f1[i].expon == f2[j].expon){ f[k].coef = f1[i].coef + f2[j].coef; f[k].expon = f1[i].expon; i++; j++; k++; }else if (f1[i].expon > f2[j].expon){ f[k].coef = f1[i].coef; f[k].expon = f1[i].expon; i++; k++; }else{ f[k].coef = f2[j].coef; f[k].expon = f2[j].expon; j++; k++; } }else{ if (i<num1){ f[k].coef = f1[i].coef; f[k].expon = f1[i].expon; i++; k++; }else{ f[k].coef = f2[j].coef; f[k].expon = f2[j].expon; j++; k++; } } } } //f1(x) = 8x13+10X9+4x2 //f2(x) = 8x18-2X9+4x+4 int main() { Poly f1[3]; Poly f2[4]; Poly f[10]; f1[0].coef = 8; f1[0].expon = 13; f1[1].coef = 10; f1[1].expon = 9; f1[2].coef = 4; f1[2].expon = 2; f2[0].coef = 8; f2[0].expon = 18; f2[1].coef = -2; f2[1].expon = 9; f2[2].coef = 4; f2[2].expon = 1; f2[3].coef = 4; f2[3].expon = 0; PolynomialAdd( f, f1, f2, 3, 4); for(int i=0;i<10;i++){ if (f[i].expon !=0 || f[i].coef !=0) cout<<"指数:"<<f[i].expon<<" "<<"系数:"<<f[i].coef<<endl; } return 0; } |
一元多项式相加运算结果:
1 2 3 4 5 6 |
指数:18 系数:8 指数:13 系数:8 指数:9 系数:8 指数:2 系数:4 指数:1 系数:4 指数:0 系数:4 |
注:将一元多项式按递减方式排序,主要是为了两一元多相式相加时的算法。如果不排序,做相加运算时,就要每次遍历。