C++ 代码实例:多项式除法简单计算工具

news2024/11/26 14:47:42

文章目录

  • 前言
  • 代码仓库
  • 代码
    • 说明
    • 核心片段
  • 结果
  • 总结
  • 参考资料
  • 作者的话

前言

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++ 代码实例:多项式除法简单计算工具。


参考资料

  • 无特定的参考资料

作者的话

  • 感谢参考资料的作者/博主
  • 作者:夜悊
  • 版权所有,转载请注明出处,谢谢~
  • 如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
  • 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
  • 文章在认识上有错误的地方, 敬请批评指正
  • 望读者们都能有所收获

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1173275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI:57-基于机器学习的番茄叶部病害图像识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

linux之按键中断

查看原理图确认引脚 可以看到按键有两个&#xff0c;分别对应GPIO5_1和GPIO4_14 配置pinctrl&#xff0c;配置成GPIO模式 1.使用官方工具&#xff0c;配置下引脚 2.将生成的代码复制到设备树里 创建设备节点 生成二进制设备树文件 在工具链表下使用 make dtbs 或者使…

“宽带中国”工具变量—海拔标准差数据集

参照刘传明&#xff08;2020&#xff09;、金环&#xff08;2021&#xff09;、胡浩然&#xff08;2023&#xff09;等的做法&#xff0c;将地级市-海拔标准差数据&#xff0c;作为“宽带中国”试点政策的工具变量 ➤相关性&#xff1a;地形起伏度会影响网络基础设施建设&…

asp.net 创建docker容器

首先创建asp.net web api 创建完成后如下图 添加docker支持 添加docker支持 添加linux docker支持

SOEM源码解析——ecx_writeeeprom(写EEPROM)

0 工具准备 1.SOEM-master-1.4.0源码1 ecx_writeeeprom函数总览 /** Write EEPROM to slave bypassing cache.&#xff1a;绕过从站缓存写EEPROM数据* param[in] context context struct 句柄* param[in] slave Slave number 从站序号* param[in] eeproma (WORD) …

Voice vlan、ICMP、单臂路由、mux-vlan

目录 一&#xff0c;Voice VLAN Voice vlan配置命令 一&#xff0c;问&#xff1a;已知网络中一台服务器的IP地址&#xff0c;如何找到这太服务器在哪台交换机的哪个接口上​编辑 思路&#xff1a; 二&#xff0c;ICMP协议 三&#xff0c;ICMP案例分析​编辑 四&#xf…

学习c++的第十一天

目录 继承和派生 基类 & 派生类 访问控制和继承 派生类的构造函数 派生类的析构函数 继承类型 多继承 重载运算符和重载函数 函数重载 运算符重载 可重载运算符/不可重载运算符 运算符重载实例 继承和派生 先来说继承&#xff0c;这与现实生活中的继承意思差不…

2023年电工杯数学建模B题人工智能对大学生学习影响的评价求解全过程论文及程序

2023年电工杯数学建模 B题 人工智能对大学生学习影响的评价 原题再现&#xff1a; 人工智能简称AI&#xff0c;最初由麦卡锡、明斯基等科学家于1956年在美国达特茅斯学院开会研讨时提出。   2016年&#xff0c;人工智能AlphaGo 4:1战胜韩国围棋高手李世石&#xff0c;期后波…

【亚马逊云科技产品测评】活动征文|亚马逊云科技AWS之EC2详细测评

引言 &#xff08;授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道&#xff09; 在当前的数字化时代&#xff0c;云服务已…

小饭店点餐系统,小餐馆点餐怎么方便,操作简单的酒店点单软件

小饭店点餐系统&#xff0c;小餐馆点餐怎么方便&#xff0c;操作简单的酒店点单软件 今天给大家分享是 佳易王酒店点餐管理系统软件V16.0版本&#xff0c;点餐界面如下图&#xff0c; 1、开台的桌子醒目显示&#xff0c;结账后或没有开台的桌子为灰色显示。 2、多种点餐方式…

Pytho入门教程之Python运行的三种方式

文章目录 一、交互式编程二、脚本式编程三、方式三关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 一、交互式编…

AMD老电脑超频及性能提升方案及实施

收拾电子元件的时候找到了若干古董的CPU 其中有一个X3 440 是原来同学主板烧了之后给我的&#xff0c;我从网上配了AM2 昂达主板&#xff0c;然后又买了AMD兼容内存&#xff0c;组成了win7 64位电脑&#xff0c;用起来非常不错&#xff0c;我把硬件配置和升级过程说明下&#x…

C++对象模型

思考&#xff1a;对于实现平面一个点的参数化。C的class封装看起来比C的struct更加的复杂&#xff0c;是否意味着产生更多的开销呢&#xff1f; 实际上并没有&#xff0c;类的封装不会产生额外的开销&#xff0c;其实&#xff0c;C中在布局以及存取上的额外开销是virtual引起的…

unittest 通过loadTestsFromName执行多个测试case

这段代码是一个使用unittest模块编写的测试运行程序。它的主要功能是加载其他Python文件中的测试用例并运行这些测试用例。 首先&#xff0c;定义了一个主测试类MainTestCase&#xff0c;该类继承自unittest.TestCase。在这个类中&#xff0c;可以添加各种测试方法来测试不同的…

产品经理入门学习(四):项目立项

参考引用 黑马-产品经理入门基础课程 1. 项目方案 1.1 主要阶段 立项阶段 基本方案&#xff1a;要做个什么项目&#xff0c;为什么要做这个项目&#xff0c;这个项目的作用和价值分别有哪些 上线阶段 设计阶段 运营阶段 开发阶段 总结阶段 测试阶段 2. 可行性分析 可…

Python语言_single_color_共140种--全平台可用

Python语言_single_color_共140种–全平台可用

3、Dockerfile 深入与其他细节

Dockerfile 在 Docker 中创建镜像最常用的方式&#xff0c;就是使用 Dockerfile。Dockerfile 是一个 Docker 镜像 的描述文件&#xff0c;我们可以理解成火箭发射的 A、B、C、D…的步骤。Dockerfile 其内部包含了一 条条的指令&#xff0c;每一条指令构建一层&#xff0c;因此每…

045_第三代软件开发-U盘监测

第三代软件开发-U盘监测 文章目录 第三代软件开发-U盘监测项目介绍U盘监测原理解释源代码 关键字&#xff1a; Qt、 Qml、 USB、 Disk、 文件 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object Language&#xff09;和…

1.如何实现统一的API前缀-web组件篇

文章目录 1. 问题的由来2.实现原理3. 总结 1. 问题的由来 系统提供了 2 种类型的用户&#xff0c;分别满足对应的管理后台、用户 App 场景。 两种场景的前缀不同&#xff0c;分别为/admin-api/和/app-api/&#xff0c;都写在一个controller里面&#xff0c;显然比较混乱。分开…

storm安装手册及笔记

图解Storm相关概念 图解storm的并发机制 安装Storm的步骤 1、安装一个zookeeper集群 2、上传storm的安装包&#xff0c;解压 3、修改配置文件storm.yaml #所使用的zookeeper集群主机 storm.zookeeper.servers: - "weekend05" - "weekend06"…