一元多项式化简

原创 2015年07月07日 19:22:48
背景:
编程实现如下功能:对输入的一元多项式,进行同类项合并,并按指数降序排序,输出处理后的一元多项式。
 
说明: 
l 多项式由若干个单项式组成,单项式之间为加、减(+,-)关系。
l 单项式指数字与字母幂的乘积构成的代数式。对一元多项式,字母只有一种。
l 同类项合并指将多项式中指数相同的单项式,系数经过加减求和,合并为一个单项式。按指数降序指多项式中,单项式按指数从大到小顺序相连。
 
格式说明
一元多项式输入输出时以字符串形式表示,格式如下
l单项式之间用单个加减运算符相连,运算符:+,- 
2单项式由系数、字母、指数标识符、指数依次直接相连组成,各部分均不能省略。
    系数:只由若干0到9数字字符组成(系数不等于0,且不以0开头) 
    字母:X
    指数标识符:^
    指数:只由若干0到9数字字符组成(指数可等于0,不等于0时不以0开头) 
3其他约定
    输入不为空串,输出若为0则以空串表示 
    字符串中除以上字符,不包含空格等其他字符,字符串尾部以’\0’结束
    多项式中第一个单项式前加运算时省略+符号,减运算时有-符号 

注意:输入多项式符合上述格式,无需检查;输出多项式格式由考生程序保证。

规格
输入多项式满足如下规格,考生程序无需检查: 
–0<单项式系数<=1000<> 
–0<=单项式指数<=3000<> 
–单项式个数不限制,但同类项合并处理后,单项式的系数小于65535。
 

<span style="font-size:18px;">示例
例一
输入:
 "7X^4-5X^6+3X^3" 
输出:
 "-5X^6+7X^4+3X^3"
例二
输入:
 "-7X^4+5X^6-3X^3+3X^3+1X^0" 
输出:
 "5X^6-7X^4+1X^0"</span>

程序代码如下:

/******************************************************************************************************
Description     : 对输入的一元多项式,进行同类项合并,输出处理后的一元多项式 
Prototype       : void OrderPolynomial (char* InputString, char* OutputString)
Input Param     : char* InputString 输入多项式字符串
Output Param    : char* OutputString 输出多项式字符串
Return Value    : void

********************************************************************************************************/
#include <vector>
#include <string>
#include <map>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
void OrderPolynomial (char* InputString, char* OutputString)
{
    /*在这里实现功能*/
	string polyInput(InputString);
	string sign("+-");
	vector<string> deliVec;
	size_t signpos=0;
	//处理开头既是负号的情况
	if(polyInput[0]=='-'){
		//从位置1开始找
		signpos=polyInput.find_first_of(sign,1);
		if(signpos!=string::npos)
			deliVec.push_back(polyInput.substr(0,signpos));
		else 
		{
			//如果是仅有一个单项式
			strcpy(OutputString,polyInput.c_str());
			return;
		}
	}
	//根据正负号分割输入字符串
	while(signpos!=string::npos){
		size_t presingpos=signpos;
		signpos=polyInput.find_first_of(sign,presingpos+1);
		//s.substr(pos,n) 如果n>s.size(),则只复制到空字符
		deliVec.push_back(polyInput.substr(presingpos,signpos-presingpos));
	}
	//以多项式的幂为键创建map,相同键值的mapped_value值存入同一个vector
	map<int,vector<int> > deliMap;
	vector<string>::iterator iter=deliVec.begin();
	while(iter!=deliVec.end()){
		string temp=*iter; 
		size_t Xpos=temp.find('X');
		string param=temp.substr(0,Xpos);
		int intParam;
		sscanf(param.c_str(),"%d",&intParam);
		size_t powPos=temp.find('^');
		string pow=temp.substr(powPos+1);
		int powParam;
		sscanf(pow.c_str(),"%d",&powParam);
		if(deliMap.count(powParam)==0){
			vector<int> tempVec;
			tempVec.push_back(intParam);
			deliMap.insert(pair<int,vector<int> >(powParam,tempVec));
		}else{
			deliMap[powParam].push_back(intParam);
		}
		++iter;
	}
	//遍历map,int为键类型升序
	map<int,vector<int> >::const_iterator iterMap=deliMap.begin();
	string result;
	while(iterMap!=deliMap.end()){
		int paramResult=0;
		vector<int>::const_iterator iterVec=(iterMap->second).begin();
		//遍历相同键值的vector
		while(iterVec!=(iterMap->second).end()){
			paramResult+=*iterVec;
			++iterVec;
		}
		char charParam[50];
		char charPow[50];
		//处理正号
		if(paramResult>0)
			sprintf(charParam,"+%d",paramResult);
		else
			sprintf(charParam,"%d",paramResult);
		sprintf(charPow,"%d",iterMap->first);
		//在字符串头部插入
		if(paramResult!=0){
			result.insert(0,charParam+string("X^")+charPow);
		}
		++iterMap;
	}
	//处理开头是正号的情况
	if(result[0]=='+')
		strcpy(OutputString,result.c_str()+1);
	else
		strcpy(OutputString,result.c_str());
    return ;
}


相关文章推荐

华为面试题:一元多项式的化简 C语言实现源码

编程实现如下功能:对输入的一元多项式,进行同类项合并,并按指数降序排序,输出处理后的一元多项式。 说明: 1.多项式由若干个单项式组成,单项式之间为加、减(+,-)关系。 2.单项式指数字与字...

[华为机试练习题]71.一元多项式化简

题目背景:编程实现如下功能:对输入的一元多项式,进行同类项合并,并按指数降序排序,输出处理后的一元多项式。 说明: 多项式由若干个单项式组成,单项式之间为加、减(+,-)关系。 单项式指数字与字母幂...

一元多项式相加(C语言实现)

poly.h#ifndef _POLY_H_ #define _POLY_H_#include #include #include//结点结构 typedef struct Polynode { ...

一元多项式的乘法与加法运算

设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分...

Python_多项式拟合

Python实现多项式拟合

【数据结构】 队列的基本操作

/* ========================================================================================== 队列...

二叉树遍历(先序、中序、后序、深度、广度)递归和非递归实现

二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。二叉树的遍历方式分为深度遍历和广度遍历,深度遍历包括前序、中序以及后序三种遍历方法,广度遍历即我们平常所说的层次遍历。因...

matlab如何化简表达式/多项式?

matlab如何化简表达式/多项式? | 浏览:2520 | 更新:2014-03-09 22:11 | 标签:matlab  1 2 3 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一元多项式化简
举报原因:
原因补充:

(最多只允许输入30个字)