[華為機試練習題]71.一元多項式化簡
阿新 • • 發佈:2019-02-20
題目
背景:
程式設計實現如下功能:對輸入的一元多項式,進行同類項合併,並按指數降序排序,輸出處理後的一元多項式。
說明:
- 多項式由若干個單項式組成,單項式之間為加、減(+,-)關係。
- 單項式指數字與字母冪的乘積構成的代數式。對一元多項式,字母只有一種。
- 同類項合併指將多項式中指數相同的單項式,係數經過加減求和,合併為一個單項式。按指數降序指多項式中,單項式按指數從大到小順序相連。
格式說明
一元多項式輸入輸出時以字串形式表示,格式如下
- 單項式之間用單個加減運算子相連,運算子:+,-
- 單項式由係數、字母、指數識別符號、指數依次直接相連組成,各部分均不能省略。
係數:只由若干0到9數字字元組成(係數不等於0,且不以0開頭)
字母:X
指數識別符號:^
指數:只由若干0到9數字字元組成(指數可等於0,不等於0時不以0開頭) - 其他約定
輸入不為空串,輸出若為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;
}