首页 > 编程语言 >C++一元多项式解析、计算、输出(数据结构作业),可直接运行

C++一元多项式解析、计算、输出(数据结构作业),可直接运行

时间:2024-09-13 23:48:56浏览次数:12  
标签:std coefficient return 多项式 C++ res Polynomial 数据结构 data

// Copyright (c) [email protected]
#include <bits/stdc++.h>

class Polynomial {
   private:
    std::unordered_map<int, int> data_;

    void zero_value_optimization() {
        for (auto iter = data_.begin(); iter != data_.end();) {
            if (iter->second == 0) {
                iter = data_.erase(iter);
            } else {
                ++iter;
            }
        }
    }

   public:
    explicit Polynomial(const std::string& s) {
        data_ = {};
        static const std::regex pattern(R"(([+-]?\d*)(x)?(\^(\d+))?)");
        for (std::sregex_iterator it(s.begin(), s.end(), pattern), end; it != end; ++it) {
            std::smatch match = *it;
            if (match[0].str().empty()) {
                continue;
            }
            std::string coeffStr = match[1];
            std::string expStr = match[4];

            int coefficient = 1;
            if (!coeffStr.empty() && coeffStr != "+" && coeffStr != "-") {
                coefficient = std::stoi(coeffStr);
            } else if (coeffStr == "-") {
                coefficient = -1;
            }

            int exponent = 0;
            if (!expStr.empty()) {
                exponent = std::stoi(expStr);
            } else if (match[2].matched) {
                exponent = 1;
            }

            data_[exponent] += coefficient;
        }
    }

    Polynomial operator*(const Polynomial& right) const {
        Polynomial res("");
        for (auto&& [i, j] : this->data_) {
            for (auto&& [k, l] : right.data_) {
                res.data_[i + k] += j * l;
            }
        }
        res.zero_value_optimization();
        return res;
    }

    Polynomial operator-(const Polynomial& right) const {
        Polynomial res("");
        for (auto&& [i, j] : this->data_) {
            res.data_[i] += j;
        }
        for (auto&& [i, j] : right.data_) {
            res.data_[i] -= j;
        }
        res.zero_value_optimization();
        return res;
    }

    Polynomial operator+(const Polynomial& right) const {
        Polynomial res("");
        for (auto&& [i, j] : this->data_) {
            res.data_[i] += j;
        }
        for (auto&& [i, j] : right.data_) {
            res.data_[i] += j;
        }
        res.zero_value_optimization();
        return res;
    }

    Polynomial derivative() const {
        Polynomial res("");
        for (auto&& [i, j] : this->data_) {
            res.data_[i - 1] += i * j;
        }
        res.zero_value_optimization();
        return res;
    }

    std::string convert_to_string() const {
        std::string res{};
        std::vector<std::pair<int, int>> temp(data_.begin(), data_.end());
        std::ranges::sort(temp, [](auto left, auto right) { return left.first > right.first; });
        for (auto&& i : temp) {
            if (i.second != 0) {
                res += generate_term(i.second, i.first);
            }
        }
        if (res.front() == '+') {
            res.erase(res.begin());
        }
        return res;
    }

    std::string generate_term(int coefficient, int exponent) const {
        if (exponent == 0) {
            return std::format("{:+d}", coefficient);
        }
        if (exponent == 1) {
            if (coefficient == 1) {
                return "+x";
            }
            if (coefficient == -1) {
                return "-x";
            }
            return std::format("{:+d}x", coefficient);
        }
        if (coefficient == 1) {
            return std::format("+x^{:d}", exponent);
        }
        if (coefficient == -1) {
            return std::format("-x^{:d}", exponent);
        }
        return std::format("{:+d}x^{:d}", coefficient, exponent);
    }
};

using namespace std;

int main() {
    string str0, str1;
    cout << "请输入两行,每行各一个表达式:\n";
    cin >> str0 >> str1;
    Polynomial p0(str0), p1(str1);
    cout << format("您输入的表达式为:\np0 : {}\np1 : {}\n", p0.convert_to_string(), p1.convert_to_string());
    cout << "下面是计算结果:\n";
    cout << format("p0 + p1 = {}\n", (p0 + p1).convert_to_string());
    cout << format("p0 - p1 = {}\n", (p0 - p1).convert_to_string());
    cout << format("p1 - p0 = {}\n", (p1 - p0).convert_to_string());
    cout << format("p0 * p1 = {}\n", (p0 * p1).convert_to_string());
    cout << format("p0' = {}\n", p0.derivative().convert_to_string());
    cout << format("p1' = {}\n", p1.derivative().convert_to_string());
}

输入格式: 3x^2+2x+7 

标签:std,coefficient,return,多项式,C++,res,Polynomial,数据结构,data
From: https://blog.csdn.net/wl886st/article/details/142236477

相关文章

  • 数据结构基础讲解(六)——串的专项练习
    本文数据结构讲解参考书目:通过网盘分享的文件:数据结构 C语言版.pdf链接: https://pan.baidu.com/s/159y_QTbXqpMhNCNP_Fls9g?pwd=ze8e 提取码:ze8e数据结构基础讲解(五)——队列专项练习-CSDN博客个人主页:樱娆π-CSDN博客目录串的定义串的类型定义、存储结......
  • 78_JAVA_new的使用在JAVA与C++的异同之处
    Java和C++都使用new关键字来创建对象和分配内存,但它们在实现和使用上有一些重要的异同之处。以下是这两种语言中new使用的主要异同点:1. 内存管理Java:自动内存管理:Java使用垃圾回收(GarbageCollection,GC)机制来自动管理内存。对象的生命周期由垃圾回收器自动管理,......
  • C++ 虚函数表解析
    一、何为多态多态(polymorphism)指为不同数据类型的实体提供统一的接口,或使用单一的符号来表示多个不同的类型。比如我们熟悉的函数重载、模板技术,都属于多态。无论是模板还是函数重载,都是静态绑定的。也就是说,究竟该调用哪个重载函数或者说调用哪个模板类的实例化,在编译期就是确认......
  • 基础数据结构-二分变形C语言实现
    基础二分下面是一个最基础的二分搜索代码,从一个数组(数据从小到大排)中找出某元素。#include<stdio.h>//函数声明intbinarySearch(intarr[],intleft,intright,intx);intmain(){//测试数据intarr[]={2,3,4,10,40};intn=sizeof(arr)......
  • C++ 继承同名Impl简单测试构造顺序析构顺序
    /*****classBase*****/classBase{public:Base();virtual~Base();protected:structImpl;Impl*m_Impl;};structBase::Impl{intnum{100};};Base::Base(){m_Impl=newImpl;std::cout<<"Base构造!"......
  • 【数据结构】字符串与JSON字符串、JSON字符串及相应数据结构(如对象与数组)之间的相互转
    前言:下面打印日志用的是FastJSON依赖库中的 @Log4j2。依赖:<!--AlibabaFastjson--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.80</version></dependency>目录普通字......
  • Hash Table 哈希表工作原理介绍及C/C++/Python实现
    HashTable哈希表工作原理介绍及C/C++/Python实现哈希表(HashTable),也称为散列表,是一种通过哈希函数将键(Key)映射到表中一个位置以便快速访问记录的数据结构。它提供了非常高效的数据检索、插入和删除操作。哈希表的基本原理是使用一个哈希函数将输入(通常是字符串)转换为一个......
  • C++入门基础知识65——【关于C++ 数据封装】
    成长路上不孤单......
  • C++入门基础知识66——【关于C++ 接口(抽象类)】
    成长路上不孤单......
  • 数据结构之美-深入理解树形结构
    一认识树形结构树形结构是一种广泛应用的非线性数据结构,它在计算机科学和日常生活中都有广泛的应用。比如文件系统,邮件系统,编译器语法树,决策树,网络通信,甚至机器学习当中,都有树形数据结构的影子。本文旨在梳理日常用到的各类树形结构以及其优点和劣势,让渎者对树形结构有一个深入......