• 简单多项式求解


    题目

    简单多项式求解

    思路

    抽象出两个类,一个类为:“项”,另一个类为:“多项式”,“项”作为”多项式“这个类的成员

    代码

    #include<bits/stdc++.h>
    
    using namespace std;
    
    class term {
    	private:
    		double x; // 自变量默认值 
    		bool isPositive; // 前缀符号 
    		int index; // 指数
    		int ratio; //系数 
    	
    	public:
    		term(int m_x, bool m_isPositive, int m_index, int m_ratio):x(m_x), isPositive(m_isPositive), index(m_index), ratio(m_ratio){};
    		double getVal(double x); // 计算单个项的结果 
    };
    
    class polynomial {
    	private:
    		
    		double answer;
    		int length; // 项的个数
    		string  polynomial_str; 
    		vector<term> term_arr;
    		
    	public:
    		
    		void transform(); // 将输入的多项式字符串转化为单个项  
    		
    		double getAnswer(double x); // 计算多项式结果 
    		
    		polynomial(string m_polynomail_str); // 初始化多项式 
    		
    		double returnAnswer(); // 获取结果 
    		
    		
    };
    
    // function
    polynomial::polynomial(string m_polynomail_str) {
    	this->polynomial_str = m_polynomail_str;
    	this->length = 0;
    	this->answer = 0;
    }
    
    void polynomial::transform() {
    	int j;
    	int m_x;
    	bool m_isPositive;
    	int m_index;
    	int m_ratio;
    	string operator_2 = "+-";
    	string temp = "x*^";
    	
    	if (this->polynomial_str[0] != operator_2[1]) {
    		this->polynomial_str = "+" + this->polynomial_str; // 格式化 
    	}
    	for (int i = 0; i < this->polynomial_str.length(); i += 1) {
    
    		if (this->polynomial_str[i] == operator_2[1] || this->polynomial_str[i] == operator_2[0]) {
    			// 一个新的项的开始
    			if(i != 0 && this->polynomial_str[i - 1] == temp[2])
    				continue;
    
    			for (j = i + 1; j < this->polynomial_str.length(); j += 1) { // 找到这一项的长度 
    				if (this->polynomial_str[j] == operator_2[0] || this->polynomial_str[j] == operator_2[1])
    					if (this->polynomial_str[j - 1] == temp[2]) {
    						continue;
    					} else {
    						break;	
    					}
    			}
    
    			string str = this->polynomial_str.substr(i, j - i); 
    
    			// 2+4*x^2-x
    			m_x = 1;
    			m_isPositive = false;
    			m_ratio = 1;
    			m_index = 1;
    			char *end;
    			
    			// 符号判断 
    			if (str[0] == operator_2[0]) {
    				m_isPositive = true;
    			}
    			cout<<"项:"<<str<<endl;
    			for (int m = 1; m < str.length(); m += 1) {
    				if (str[m] == temp[1]) { // = *
    					// 获取系数  
    					string tempStr = str.substr(1, m - 1);
    					m_ratio = static_cast<int>(strtol(tempStr.c_str(),&end,10));
    				} else if (str[m] == temp[2]) {
    					// 有指数
    					if (str[m + 1] == operator_2[1]) {
    						// 负指数
    						string tempStr = str.substr(m + 2); 
    						m_index = - static_cast<int>(strtol(tempStr.c_str(),&end,10));
    					} else {
    						// 正指数 
    						string tempStr = str.substr(m + 1); 
    						m_index = static_cast<int>(strtol(tempStr.c_str(),&end,10));
    					}
    				} else if (str[m] == temp[0]) {
    					// 有 x
    					m_x = 2; 
    				} 
    			}
    			
    			if (!m_ratio) {
    				m_ratio = 1;
    			}
    			
    			if (m_x == 1) {
    				// 常数
    				m_ratio = static_cast<int>(strtol(str.substr(1).c_str(),&end,10));
    			}
    			
    			term A(m_x, m_isPositive, m_index, m_ratio);
    			this->term_arr.push_back(A);
    			this->length += 1; 
    		}		
    	}
    }
    
    double polynomial::getAnswer(double x) {
    	for (int i = 0; i < this->length; i += 1) {
    		this->answer += this->term_arr[i].getVal(x);
    	}
    }
    
    // 2*x+3*x^-2-x+4-1 
    
    double polynomial::returnAnswer() {
    	return this->answer; 
    }
    
    double term::getVal(double x) {
    	if (this->x == 2) {
    		this->x = x;
    	}
    	
    	double val; 
    	if (this->isPositive)
    		val = pow(this->x, index) * ratio;
    	else 
    		val = - pow(this->x, index) * ratio;
    		
    	return val;
    }
    
    void test01() {
    	string poly_str;
    	double x;
    	cin>>poly_str;
    	polynomial p(poly_str);
    	p.transform();
    	cin>>x;
    	p.getAnswer(x);
    	cout<<"结果:"<<p.returnAnswer()<<endl;
    }
    
    int main() {
    	test01();
    	return 0;
    } 
    

    测试:
    2*x+3*x^-2-x+4-1
    项:+2*x
    项:+3*x^-2
    项:-x
    项:+4
    项:-1
    3
    结果:6.33333

  • 相关阅读:
    041.PGSQL-pgsql常用命令-查看日志文件大小、数据目录、运行日志相关配置、当前lsn
    041.PGSQL-pgsql时间日期错误问题,原来是系统时间问题,使用远程的NTP时间服务器来提供时间的话,需要使用timedatectl设置将NTP时间同步开启。
    040.PGSQL-备份和恢复-增量备份-创建基础备份
    039.PGSQL-备份和恢复-增量备份-开启wal归档、并设置定时清理备份之后的wal文件
    037.PGSQL-事务 savepoint 保存点、rollback to 回滚
    硬件黑客之无线电安全 --- Proxmark3 RDV4 套件
    我有一个想法。。。
    硬件嘿客之嘿客仓库
    WPA GPU基准测试
    什么是家用路由器,带你重新认识一下
  • 原文地址:https://www.cnblogs.com/azoux/p/13693919.html
Copyright © 2020-2023  润新知