本文实现了一个多项式的类,类中重载了多项式的加法、减法、乘法,并且对>> 和 << 进行了重载。
其中多项式的输入(输出)格式为: K N1 aN1N2 aN2... NK aNK
其中K表示多项式的系数,NK表示第K项的系数aNk相应的系数,并且多项式的系数递减的序列。
1 //polynomial.h
2 #include <iostream>
3 #include <vector>
4 #include <iomanip>
5
6 class polynomial
7 {
8 private:
9 std::vector<double> coefficient;
10 std::vector<int> radix;
11 public:
12 polynomial(){}
13 polynomial(const polynomial &poly){ *this = poly; }
14 ~polynomial(){}
15 friend polynomial operator+(const polynomial &poly1, const polynomial &poly2);
16 friend polynomial operator-(const polynomial &poly1, const polynomial &poly2);
17 polynomial& operator+=(const polynomial &poly){ *this = *this + poly; return *this; }
18 polynomial& operator-=(const polynomial &poly){ *this = *this - poly; return *this; }
19 friend polynomial operator*(const polynomial &poly1, const polynomial &poly2);
20 friend std::istream& operator>>(std::istream &is, polynomial &poly);
21 friend std::ostream& operator<<(std::ostream &os, const polynomial &poly);
22 };
23
24 polynomial operator+(const polynomial &poly1, const polynomial &poly2)
25 {
26 polynomial polysum;
27
28 int i = 0, j = 0;
29 while (i<poly1.radix.size() || j<poly2.radix.size())
30 {
31 //only poly1
32 if (i<poly1.radix.size() && j == poly2.radix.size())
33 {
34 polysum.radix.push_back(poly1.radix[i]);
35 polysum.coefficient.push_back(poly1.coefficient[i]);
36 i++;
37 }
38 //only poly2
39 else if (j<poly2.radix.size() && i == poly1.radix.size())
40 {
41 polysum.radix.push_back(poly2.radix[j]);
42 polysum.coefficient.push_back(poly2.coefficient[j]);
43 j++;
44 }
45 //the radix of poly1 greater than poly2
46 else if (poly1.radix[i] > poly2.radix[j])
47 {
48 polysum.radix.push_back(poly1.radix[i]);
49 polysum.coefficient.push_back(poly1.coefficient[i]);
50 i++;
51 }
52 //the radix of poly1 smaller than poly2
53 else if (poly1.radix[i] < poly2.radix[j])
54 {
55 polysum.radix.push_back(poly2.radix[j]);
56 polysum.coefficient.push_back(poly2.coefficient[j]);
57 j++;
58 }
59 //the radix of poly1 equal to poly2
60 else
61 {
62 if (poly1.coefficient[i] + poly2.coefficient[j] != 0)
63 {
64 polysum.radix.push_back(poly1.radix[i]);
65 polysum.coefficient.push_back(poly1.coefficient[i] + poly2.coefficient[j]);
66 }
67 i++;
68 j++;
69 }
70 }
71
72 return polysum;
73 }
74
75 polynomial operator-(const polynomial &poly1, const polynomial &poly2)
76 {
77 polynomial negativePoly;
78
79 negativePoly = poly2;
80 for (int i = 0; i < negativePoly.coefficient.size(); i++)
81 negativePoly.coefficient[i] = -negativePoly.coefficient[i];
82
83 return poly1 + negativePoly;
84 }
85
86 polynomial operator*(const polynomial &poly1, const polynomial &poly2)
87 {
88 polynomial mul;
89
90 int i = 0;
91 while (i < poly2.coefficient.size())
92 {
93 polynomial part = poly1;
94 double coefficient = poly2.coefficient[i];
95 int radix = poly2.radix[i];
96
97 for (int j = 0; j < part.coefficient.size(); j++)
98 {
99 part.radix[j] += radix;
100 part.coefficient[j] *= coefficient;
101 }
102 mul += part;
103 i++;
104 }
105
106 return mul;
107 }
108
109 std::istream& operator>>(std::istream &is, polynomial &poly)
110 {
111 int k;
112 is >> k;
113 for (int i = 0; i<k; i++)
114 {
115 double tmpcoe;
116 int tmprad;
117 is >> tmprad >> tmpcoe;
118 poly.radix.push_back(tmprad);
119 poly.coefficient.push_back(tmpcoe);
120 }
121
122 return is;
123 }
124
125 std::ostream& operator<<(std::ostream &os, const polynomial &poly)
126 {
127 os << poly.radix.size();
128 if (poly.radix.size() != 0)
129 std::cout << " ";
130 for (int i = 0; i<poly.radix.size(); i++)
131 {
132 os << poly.radix[i] << " " << std::fixed << std::setprecision(1) << poly.coefficient[i];
133 if (i != poly.radix.size() - 1)
134 os << " ";
135 }
136
137 return os;
138 }
原文链接: https://www.cnblogs.com/jackwang822/p/4700361.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/220103
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!