[D-OJ练习] 一元多项式的运算

已知一元多项式:A(x)=a0+a1x+a2x2+a3x3+….anxn, B(x)= b0+b1x+b2x2+b3x3+….bmxm设计算法实现C(x)=A(x)+B(x)。功能包括输入多项式A,输入多项式B,求A和B的和,显示求和后的结果等操作。本题中,链表的第一个元素位置为1,链表的数据域格式为

coefexp

其中coef为系数,exp为指数。

输入描述

各个命令以及相关数据的输入格式如下: 
输入多项式A:A,接下来的n行是要输入的多项式,每一行数据有两个值,
第一个值代表系数,第二个值代表指数,当第一个值为0时,多项式A输入结束 
输入多项式B:B,接下来的n行是要输入的多项式,每一行数据有两个值,
第一个值代表系数,第二个值代表指数,当第一个值为0时,多项式B输入结束
求多项式A和B的和:C 
当输入的命令为E时,程序结束

输出描述

当输入的命令为C时,请输出A和B两个多项式的和,输出格式与输入格式相同 
注意,所有的元素均占一行

输入样例

A
3 1
1 2
-1 10
4 12
-1 100
0 1
B
-4 0
1 1
-3 2
1 6
-1 9
10 12
1 100
0 1
C
E

输出样例

-4 0
4 1
-2 2
1 6
-1 9
-1 10
14 12

利用STL的写法(OJ不给力的话不给过,但写法本身无问题):

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
    vector<pair<int, int>> s;
    char ch;
    int coef,ex;

    while ((cin>>ch) && ch != 'E')
    {
    	switch(ch)
    	{
    	case 'A':
    	case 'B':
    		while((cin>>coef>>ex) && coef )
		    {
		        s.push_back({ex,coef});
		    }
    		break;
		case 'C':
			sort(s.begin(),s.end());
			int a=0,b=0;
	        int cnt=1;
	        for(auto item : s)
	        {
	            if(cnt==1){
	                a = item.second;//系数
	                b = item.first;//指数
	            }else{
	                if(item.first != b){
	                    if(a != 0){
	                        cout << a << ' ' << b ;
	                    }
	                    a = item.second; //更新
	                    b = item.first;
	                }else{
	                    a += item.second;
	                }
	            }
	            cnt++;
	        }
			break;
			
		}
	}
	return 0;
}

利用链表(朴实写法)

#include<iostream>
using namespace std;


struct Node
{
    int coef;
    int exp;
    Node* next;
    Node(int c,int e):coef(c),exp(e),next(NULL){}
};

void NodeRank(Node* head)//直插排序 
{
        Node* p = head->next;
        Node* pre = NULL, * q = NULL;
        if (p == NULL) {
            return;
        }
        p = p->next;
        head->next->next = NULL;

        while (p)
        {
            q = p->next;
            pre = head;
            while (pre->next && pre->next->exp <= p->exp)
            {
                pre = pre->next;
            }
            p->next = pre->next;
            pre->next = p;
            p = q;
        }
}
int main()
{
    Node* head = new Node(0,0);
    Node* p = head;
    Node* newNode;
    char ch;
    int coef, exp;
    while ((cin >> ch) && ch != 'E')
    {
        switch (ch)
        {
        case 'A':
        case 'B':
            while ((cin >> coef >> exp)&&coef)
            {
                newNode = new Node(coef, exp);
                p->next = newNode;
                p = newNode;
            }     
            break;
        case 'C':
            NodeRank(head);
            int a = 0, b = 0;
            int cnt = 1;
            p = head;
            while(p)
            {
                if (cnt == 1) {
                    a = p->coef;//系数
                    b = p->exp;//指数
                }
                else {
                    if (p->exp != b) {
                        if (a != 0) {
                            cout << a << ' ' << b ;
                        }
                        a = p->coef; //更新
                        b = p->exp;
                        //ret=1;
                    }
                    else {
                        a += p->coef;
                    }
                }
                cnt++;
                p = p->next;
            }
            if(a!=0){
            	cout << a << ' ' << b ;
			}
            break;

        }
    }
    return 0;
}

posted @ 2021-09-23 23:43  泥烟  阅读(85)  评论(0编辑  收藏  举报