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

原创 2015年07月07日 16:48:23

题目

背景:

编程实现如下功能:对输入的一元多项式,进行同类项合并,并按指数降序排序,输出处理后的一元多项式。

说明:

  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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

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

一元多项式化简

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

[华为机试练习题]60.水仙花数

题目描述: 水仙花数又称阿姆斯特朗数。 水仙花数是指一个n 位数( n≥3 ),它的每个位上的数字的n 次幂之和等于它本身。(例如:1^3 + 5^3 + 3^3 = 153) 求输入的数字是...

[华为机试练习题]34.识别有效的IP地址和掩码并进行分类统计

题目描述: 请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。所有的IP地址划分为 A,B,C,D,E五类A类地址1.0.0.0~126.2...

[华为机试练习题]27.渊子赛马

题目描述: 题目描述赛马是一古老的游戏,早在公元前四世纪的中国,处在诸侯割据的状态,历史上称为“战国时期”。在魏国作官的孙膑,因为受到同僚庞涓的迫害,被齐国使臣救出后,到达齐国国都。 赛马是当时最受...

[华为机试练习题]28.报数

题目描述: 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出,问最后留下的那位是原来第几号。 题目类别: 数组,指针 难度: 初级 运行时间限制: 10S...

[华为机试练习题]54.判断任意两台计算机的IP地址是否属于同一子网络

题目描述: 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。 最为简单的理解就是两台计算机各自的IP地址与子网掩码进行AND运算后,如果得出的结果是相同的,则说明这两台计算...

[LeetCode]234.Palindrome Linked List

题目Given a singly linked list, determine if it is a palindrome.Follow up: Could you do it in O(n) ti...

[华为机试练习题]50.求M的N次方的最后三位

题目描述: 正整数M 的N次方有可能是一个非常大的数字,我们只求该数字的最后三位例1:比如输入5和3 ,5的3次方为125,则输出为125 例2:比如输入2和10 2的10次方为1024 ,...

[华为机试真题][2014]63.等式变换

题目输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。1 2 3 4 5 6 7 8 9 = X比如:12-34+5-67+89 = 51+23+4-5+6-7-8-9 = ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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