文章目录
- 前言
- 代码仓库
- 代码
- 说明
- 核心片段
- 结果
- 总结
- 参考资料
- 作者的话
前言
C++ 代码实例:多项式除法简单计算工具。
代码仓库
- yezhening/Programming-examples: 编程实例 (github.com)
- Programming-examples: 编程实例 (gitee.com)
代码
说明
- 由于代码篇幅较多,在博客中直接粘贴并呈现会显得冗长,因此未在博客中放置完整代码,只展示核心片段代码。请前往"代码仓库"查看或获取相关代码
- 简单地计算多项式除法
- 注释有详细的步骤解析
- 好用的多项式除法在线计算网址:在线计算器: 多项式除法 (planetcalc.com)
- 多项式除法,被除数和除数写在程序中:main.exe、main.cpp、polynomial.cpp、polynomial.h
- 多项式除法,在终端输入被除数和除数:main1.exe、main1.cpp、polynomial.cpp、polynomial.h
注:一个晚上一个早上完成,应该大部分结果对,若出现小部分结果错误懒得管了,逻辑差不多那样
核心片段
polynomial.h
#ifndef POLYNOMIAL_H
#define POLYNOMIAL_H
#include <vector>
#include <iostream>
using std::ostream;
using std::vector;
// 多项式类
class Polynomial
{
public:
explicit Polynomial(const vector<int> &p) : poly_vec(p) {} // 私有成员只能在类的成员函数内部被初始化
// 重载运算符 “<<” 输出多项式
// friend:类外会用该运算符访问类的成员,不写报错:too many parameters for this operator function
// 返回输出流对象引用,可以链式操作
friend ostream &operator<<(ostream &output, const Polynomial &obj);
// 重载运算符 “/” 进行多项式除法
// 返回值:商
// 参数:除数
Polynomial operator/(const Polynomial &divisor) const; // const表示不会改变调用该方法的被除数
// 重载运算符 “%” 进行多项式除法求余
// 返回值:余数
// 参数:除数
// 照搬除法逻辑,只改动最后return的返回值,最后的余数就是最后更新的被除数
Polynomial operator%(const Polynomial &divisor) const; // const表示不会改变调用该方法的被除数
private:
const vector<int> poly_vec; // 多项式的向量表示
};
#endif // POLYNOMIAL_H
polynomial.cpp
// 重载运算符 “<<” 输出多项式
// 不需要friend、类作用域声名,因为是类外的运算符
ostream &operator<<(ostream &output, const Polynomial &obj)
{
UINT terminal_code_page = GetConsoleOutputCP(); // 获取当前终端的输出代码页
if (terminal_code_page != 65001)
{
system("chcp 65001"); // 终端切换使用utf8字符集显示,以可以显示utf8的上标
// 注意:会切换终端页,需要重新运行程序
}
else // 65001
{
}
for (int i = obj.poly_vec.size() - 1; i >= 0; --i) // 从高位到低位 i既表示索引也表示次数
{
// 1. 系数的符号
// 正数显示+,负数不显示-,系数负数已有-
if (obj.poly_vec.at(i) >= 0)
{
cout << "+";
}
else // obj.poly.at(i) < 0
{
// cout << " - ";
}
// 2. 系数
cout << obj.poly_vec.at(i);
// 3. 形式参数
cout << "x";
// 4. 次数
// 上标号的utf8编码
// 如:0上标号⁰的utf8编码在索引0为\u2070,1上标号¹的utf8编码在索引1为\u00B9,以此类推
vector<string> superscript_utf8{"\u2070", "\u00B9", "\u00B2", "\u00B3", "\u2074", "\u2075", "\u2076", "\u2077", "\u2078", "\u2079"};
cout << superscript_utf8.at(i);
}
return output;
}
// 重载运算符 “/” 进行多项式除法
// 返回值:商
// 参数:除数
Polynomial Polynomial::operator/(const Polynomial &divisor) const // const表示不会改变调用该方法的被除数
{
// 1. 准备被除数、除数和商
// 解封装,获取被除数和除数向量
// 1.1 方便操作
// 1.2 不再是const,可以修改再封装出去
vector<int> dividend_vec(this->poly_vec); // 被除数
vector<int> divisor_vec(divisor.poly_vec); // 除数
// 商初始的次数是被除数最高项次数 - 除数最高项次数 + 1
// 如:
// 4x³ + 3x² + 2x + 1,的个数是4,最高项次数次数是 4 - 1 = 3
// x² + 2x + 1的个数是3,最高项次数次数是 3 - 1 = 2
// 最高项相除,4x³ / x² = 4x,商的最高项次数是 3 - 2 = 1
// 因为索引从0开始,所以需要+1,商系数的个数是1 + 1 = 2,初始化为0
vector<int> quotient_vec((dividend_vec.size() - 1) - (divisor_vec.size() - 1) + 1, 0); // 商
// 2. 除法运算
// 2.1 如果被除数最高项次数 < 除数最高项次数,即 dividend_vec.size() - 1 < divisor_vec.size() - 1,商返回0
// 如:4x³ + 3x² + 2x + 1 / x⁵ + 2x + 3,被除数最高项 4x³ 次数4 < 除数最高项 x⁵ 次数5,无法除,返回0(只有1个元素,索引0值0)
if ((dividend_vec.size() - 1) < (divisor_vec.size() - 1))
{
quotient_vec.resize(1, 0);
}
// ...
}
// 重载运算符 “%” 进行多项式除法求余
// 返回值:余数
// 参数:除数
// 照搬除法逻辑,只改动最后return的返回值,最后的余数就是最后更新的被除数
Polynomial Polynomial::operator%(const Polynomial &divisor) const // const表示不会改变调用该方法的被除数
{
// ...
}
main.cpp
#include "polynomial.h"
using std::cout;
using std::endl;
int main()
{
// int 型向量表示多项式,x作为形式参数无具体意义只有方便理解的展示意义,索引表示次数,值表示系数
// 如 {1, 2},索引0值1表示1x⁰,索引1值2表示2x¹,所以多项式是:2x¹ + 1x⁰ = 2x + 1
const vector<int> dividend_vec{1, 2, 3, 4}; // 被除数,4x³ + 3x² + 2x + 1
const vector<int> divisor_vec{3,2,1}; // 除数,x² + 2x + 3
// 多项式类表示多项式,进一步封装
const Polynomial dividend(dividend_vec);
const Polynomial divisor(divisor_vec);
cout << "被除数: " << dividend << endl;
cout << "除数: " << divisor << endl;
// 多项式除法求商
Polynomial quotient = dividend / divisor;
cout << "商: " << quotient << endl;
// 多项式除法求余数
Polynomial remainder = dividend % divisor;
cout << "余数: " << remainder << endl;
return 0;
}
main1.cpp
#include <sstream> // istringstream
#include "polynomial.h"
using std::cin;
using std::cout;
using std::endl;
using std::getline;
using std::istringstream;
using std::string;
int main()
{
// 终端输入被除数和除数
// int 型向量表示多项式,x作为形式参数无具体意义只有方便理解的展示意义,索引表示次数,值表示系数
// 如 {1, 2},索引0值1表示1x⁰,索引1值2表示2x¹,所以多项式是:2x¹ + 1x⁰ = 2x + 1
// 1. 被除数
vector<int> dividend_vec(0);
cout << "被除数系数,从高到低位输入,空格分隔,回车结束: " << endl;
string input("");
getline(cin, input); // 从终端获取一行输入
istringstream iss(input); // 字符串 -> 输入流对象
int num(0);
while (iss >> num) // 输入流对象 -> 数字
{
dividend_vec.insert(dividend_vec.begin(), num); // 从后往前插入
}
// 2. 除数
vector<int> divisor_vec(0);
cout << "除数系数,从高到低位输入,空格分隔,回车结束: " << endl;
input = "";
getline(cin, input);
iss.clear(); // 清楚流状态,否则获取不到数字
iss.str(input);
num = 0;
while (iss >> num)
{
divisor_vec.insert(divisor_vec.begin(), num);
}
// 多项式类表示多项式,进一步封装
const Polynomial dividend(dividend_vec);
const Polynomial divisor(divisor_vec);
cout << "被除数: " << dividend << endl;
cout << "除数: " << divisor << endl;
// 多项式除法求商
Polynomial quotient = dividend / divisor;
cout << "商: " << quotient << endl;
// 多项式除法求余数
Polynomial remainder = dividend % divisor;
cout << "余数: " << remainder << endl;
return 0;
}
Makefile
.PHONY : all
all : main.exe main1.exe
main.exe : main.cpp polynomial.cpp
g++ -o $@ $^
main1.exe : main1.cpp polynomial.cpp
g++ -o $@ $^
.PHONY : clean
clean :
del *.exe
结果
总结
C++ 代码实例:多项式除法简单计算工具。
参考资料
- 无特定的参考资料
作者的话
- 感谢参考资料的作者/博主
- 作者:夜悊
- 版权所有,转载请注明出处,谢谢~
- 如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
- 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
- 文章在认识上有错误的地方, 敬请批评指正
- 望读者们都能有所收获