标签:
背景:注意:输入多项式符合上述格式,无需检查;输出多项式格式由考生程序保证。
规格
输入多项式满足如下规格,考生程序无需检查:
–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 ; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/sxhlovehmm/article/details/46793329