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