1. 程式人生 > >[華為機試練習題]71.一元多項式化簡

[華為機試練習題]71.一元多項式化簡

題目

背景:

程式設計實現如下功能:對輸入的一元多項式,進行同類項合併,並按指數降序排序,輸出處理後的一元多項式。

說明:

  1. 多項式由若干個單項式組成,單項式之間為加、減(+,-)關係。
  2. 單項式指數字與字母冪的乘積構成的代數式。對一元多項式,字母只有一種。
  3. 同類項合併指將多項式中指數相同的單項式,係數經過加減求和,合併為一個單項式。按指數降序指多項式中,單項式按指數從大到小順序相連。

格式說明

一元多項式輸入輸出時以字串形式表示,格式如下

  1. 單項式之間用單個加減運算子相連,運算子:+,-
  2. 單項式由係數、字母、指數識別符號、指數依次直接相連組成,各部分均不能省略。
    係數:只由若干0到9數字字元組成(係數不等於0,且不以0開頭)
    字母:X
    指數識別符號:^
    指數:只由若干0到9數字字元組成(指數可等於0,不等於0時不以0開頭)
  3. 其他約定
    輸入不為空串,輸出若為0則以空串表示
    字串中除以上字元,不包含空格等其他字元,字串尾部以’\0’結束
    多項式中第一個單項式前加運算時省略+符號,減運算時有-符號

注意:輸入多項式符合上述格式,無需檢查;輸出多項式格式由考生程式保證

規格

輸入多項式滿足如下規格,考生程式無需檢查: 
–0<單項式係數<=1000<> 
–0<=單項式指數<=3000<> 
–單項式個數不限制,但同類項合併處理後,單項式的係數小於65535。

示例

例一
輸入:
 "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"

練習階段:

中級 

程式碼

/*---------------------------------------
*   日期:2015-07-07
*   作者:SJF0115
*   題目:一元多項式化簡 
*   來源:華為機試練習題
-----------------------------------------*/
#include <iostream>
#include <map>
#include <string>
#include <stack>
using namespace std;

// 整型轉換為字串
string Int2Str(int
num){ string str = ""; if(num == 0){ str = "0"; return str; }//if while(num){ str.insert(str.begin(),num % 10 + '0'); num /= 10; }//while return str; } /****************************************************************************************************** Description : 對輸入的一元多項式,進行同類項合併,輸出處理後的一元多項式 Prototype : void OrderPolynomial (char* InputString, char* OutputString) Input Param : char* InputString 輸入多項式字串 Output Param : char* OutputString 輸出多項式字串 Return Value : void ********************************************************************************************************/ void OrderPolynomial (char* InputString, char* OutputString){ if(InputString==NULL){ return; }//if // key 為 係數 map<int,int> Map; int size = strlen(InputString); char* str = InputString; int index = 0; while(index < size){ bool positive = true; // 正負號 if(str[index] == '+' ){ ++index; }//if else if(str[index] == '-'){ positive = false; ++index; }//else // 係數 int num = 0; while(str[index] >= '0' && str[index] <= '9'){ num =num * 10+ str[index] - '0'; ++index; }//while if(!positive){ num = -num; }//if //跳過X^ index += 2; // 指數 int number = 0; while(str[index] >= '0' && str[index] <= '9'){ number = number * 10+ str[index] - '0'; ++index; }//while // 相同指數 map<int,int>::iterator ite = Map.find(number); if(ite != Map.end()){ ite->second += num; }//if // 沒有相同指數 else{ Map.insert(pair<int,int>(number,num)); }//else }//while map<int,int>::reverse_iterator ite = Map.rbegin(); index = 0; bool isFirst = true; while(ite != Map.rend()){ // 等於 0 if(ite->second == 0){ ++ite; continue; }//if // 大於 0 int num = ite->second; if(ite->second > 0){ if(!isFirst){ OutputString[index++] = '+'; }//if }//if // 小於 0 else if(ite->second < 0){ OutputString[index++] = '-'; num = -num; }//else isFirst = false; // 係數 string tmp = Int2Str(num); for(int i = 0;i < tmp.size();++i){ OutputString[index++] = tmp[i]; }//for OutputString[index++] ='X'; OutputString[index++] ='^'; // 指數 tmp = Int2Str(ite->first); for(int i = 0;i < tmp.size();++i){ OutputString[index++] = tmp[i]; }//for ++ite; }//while OutputString[index]='\0'; //cout<<OutputString<<endl; return; }