首页 > 试题广场 >

求两个多项式的和

[编程题]求两个多项式的和
  • 热度指数:4814 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
输入两个多项式,计算它们的和。 每个多项式有若干对整数表示,每组整数中,第一个整数表示系数(非0),第二个整数表示该项的次数。 如由3 3 5 -2 1 4 0表示3x^5 - 2 * x + 4其中第一个3表示该多项式由三个整数对表示。

输入描述:
输入为两行,分别表示两个多项式。表示每项的整数对按照次数大小降序给出。(次数绝对值小于1000,系数绝对值小于10000)


输出描述:
按照降次顺序输出表示和多项式的整数对(系数为0的整数对不用输出,整数对由空格分隔,最后一个整数对后不添加空格)
示例1

输入

3 3 5 -2 1 4 0
4 2 3 -1 2 1 1 3 0

输出

3 5 2 3 -1 2 -1 1 7 0
系数可能有负值,存储的时候加个偏移量(这道题是1000)即可。比如x^5的系数就存储在buf[5+1000]
#include <stdio.h>
#define N 3000
#define OFFSET 1000

int main()
{
    int n;
    int a[N];//系数矩阵
    int x, y;//系数和次数
    while(scanf("%d", &n)!=EOF)
    {
        for(int i=0; i<N; i++)
        {
            a[i]=0;
        }
        for(int i=0 ;i<n; i++)
        {
            scanf("%d %d", &x, &y);
            a[y+OFFSET]+=x;
        }
        scanf("%d", &n);
        for(int i=0 ;i<n; i++)
        {
            scanf("%d %d", &x, &y);
            a[y+OFFSET]+=x;
        }
        bool isfirst=true;
        for(int i=N-1; i>=0; i--)
        {
            if(a[i]!=0)
            {
                if(isfirst) isfirst=false;
                else printf(" ");
                printf("%d %d", a[i], i-OFFSET);
            }
        }
        printf("\n");
    }
    return 0;
}

发表于 2018-02-24 17:18:32 回复(0)
#include <iostream>
#include <string>
#define SizeMax 2001 //定义最大用于存储的容量2 × 1000
using namespace std;
int main() {
    int arr[SizeMax] = { 0 }, N, M, cefc, index, count = 0;
    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> cefc >> index; //依次录入系数cef和对应的指数index
        arr[1000 + index] = arr[1000 + index] + cefc; //5x^3存储为arr[1005] = 3;
    }
    cin >> M;
    for (int i = 0; i < M; i++) {
        cin >> cefc >> index;
        arr[1000 + index] = arr[1000 + index] + cefc; //假若指数相同,则相加
    }
    for (int i = 0; i < SizeMax; i++)
        if (arr[i] != 0)
            count++; //数出非零项数
    for (int i = SizeMax - 1; i >= 0; i--) //从2000 -> 0依次输出系数非零的元素
        if (arr[i] != 0) {
            count--;
            cout << arr[i] << ' ' << i - 1000;
            if (count) //最后一项用换行符,否则空格
                cout << ' ';
            else
                cout << endl;
        }
}

编辑于 2017-02-13 09:26:03 回复(0)
#include<iostream>
#include<map>
using namespace std;
//用map这个关联容器实现系数与相应次数的一一对应
int main(void)
{
    int n_1;
    map<int,int> a;

    
    while(cin >> n_1)
    {
        for(int i = 0;i < n_1;i++)
        {
            int x,y;
            cin >> x >> y;
            a[y] = x;
        }
        
        int n_2;
        cin >> n_2;
        
        for(int i = 0;i < n_2;i++)
        {
            int x,y;
            cin >> x >> y;
            a[y] += x;
        }
        
        map<int,int>::iterator it = a.end();
        for(;it != a.begin();it--)
            if(it->second != 0)
                cout << it->second << ' ' << it->first << ' ';
         it->second != 0 ? cout << it->second << ' ' << it->first << endl: cout << endl;
     }
    return 0;
}

发表于 2021-02-25 16:35:46 回复(0)
注意次数有负的!!!!!!绝对值<10000,+10000即可。
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int arr[20002]={0};
    for(int k=0,n,a,b;k<2;++k)
    {
        cin>>n;
        for(int i=0;i<n;++i)
        {
            cin>>a>>b;
            arr[b+10000]+=a;
        }
    }
    bool first=true;
    for(int i=20001;i>=0;--i)
        if(arr[i]!=0 )
        {
            if(first)
            {
                    cout<<arr[i]<<" "<<i-10000;
                    first=false;
            }
            else
                cout<<" "<<arr[i]<<" "<<i-10000;
        }   
    cout<<endl;
}


发表于 2021-02-02 19:38:24 回复(0)
指数有可能是负数
从指数大的往小的遍历,不是到0截止,而是到-1001

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n,x,y; 
    while(cin>>n){
        int M=-1;
        unordered_map<int,int> mp;
        for(int i=0;i<n;i++){
            cin>>x>>y;
            mp[y]=x;
            if(y>M) M=y;
        }
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>x>>y;
            mp[y]+=x;
            if(y>M) M=y;
        }
        int flag=0;
        for(int i=M;i>=-1001;i--){
            if(mp[i]!=0){
                if(flag==0) cout<<mp[i]<<" "<<i;
                else cout<<" "<<mp[i]<<" "<<i;
                flag++;
            }
        }
        cout<<endl;
    }
    return 0;
}
发表于 2019-08-03 10:24:21 回复(0)
#Python解释不多,致力于推广Python,所以给出Python实现
while True:
    try:
        digitList1 = list(map(int, input().split()))
        digitList2 = list(map(int, input().split()))
        num1 = digitList1[0]
        num2 = digitList2[0]
        temp = []        #保存整数对
        for i in range(num1):
            temp.append([digitList1[i * 2 + 1], digitList1[i * 2 + 2]])
        for i in range(num2):
            temp.append([digitList2[i * 2 + 1], digitList2[i * 2 + 2]])
        temp.sort(key=lambda x: x[1],reverse=True)  #对整数对进行排序,以次数为关键字排序,默认为升序,所以反转为降序
        result = []          #保存结果整数对
        lastNum = temp[0][1]
        modulus = temp[0][0]
        temp.pop(0)
        for i in temp:
            if i[1] == lastNum:
                modulus += i[0]
            else:
                if modulus != 0:    #序数不为0才加入到结果中
                    result.append(modulus)
                    result.append(lastNum)
                lastNum = i[1]
                modulus = i[0]
        if modulus != 0:         #结尾还剩余最后项未在循环中处理,所以在结束后增加处理
            result.append(modulus)
            result.append(lastNum)
        print(' '.join(map(str,result)))
    except Exception:
        break

编辑于 2018-09-16 22:03:48 回复(0)
//存储在map中,后面再顺序的读取 import java.util.*;
public class Main{
    public static void main(String[] args){
        HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
        Scanner scanner=new Scanner(System.in);
        int input_one_size=scanner.nextInt();
        for(int i=0;i<input_one_size;i++){
            int coefficient=scanner.nextInt();
            int degree=scanner.nextInt();
            map.put(degree,coefficient);
        }
        int input_two_size=scanner.nextInt();
        for(int i=0;i<input_two_size;i++){
            int coefficient=scanner.nextInt();
            int degree=scanner.nextInt();
            if(map.containsKey(degree)){
                int value=map.get(degree);
                map.put(degree,value+coefficient);
            }else
                map.put(degree,coefficient);
        }
        for(int i=1000;i>=-1000;i--){
            if(map.containsKey(i) && map.get(i)!=0){
                System.out.print(map.get(i)+" "+i+" ");
            }
        }
    }
}

发表于 2018-09-13 10:55:05 回复(0)
#include<iostream>
#include<map>
#include<vector>
using namespace std;
int main()
{
    map<int, int> mmp;
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        int a,b;
        cin>>a>>b;
        mmp[b] = a;
    }
    cin>>n;
    for(int i=0; i<n; i++)
    {
        int a,b;
        cin>>a>>b;
        map<int, int>::iterator it = mmp.find(b);
        if(it != mmp.end())
        {
            mmp[b] = it->second+a;
            if(mmp[b] == 0)
                mmp.erase(b);
        }
        else
            mmp[b] = a;
    }
    vector<int> res;
    for(map<int, int>::iterator it = mmp.begin(); it != mmp.end(); it++)
    {
        res.push_back(it->first);
        res.push_back(it->second);
    }
    for(int i=res.size()-1; i>0; i--)
        cout<<res[i]<<" ";
    cout<<res[0]<<endl;
    return 0;
}

发表于 2018-04-28 14:03:49 回复(0)
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

int main()
{
    int n;
    while (cin >> n)
    {
        int a[2002] = {0};
        int coef, time, m;
        int maxa, maxb;
        int mina, minb;
        cin >> coef >> mina;
        a[mina + 1000] = coef;
        for (int i = 3; i <= n; i++)
        {
            cin >> coef >> time;
            a[time + 1000] = coef;
        }
        cin >> coef >> maxa;
        a[maxa + 1000] = coef;
        cin >> m;
        cin >> coef >> minb;
        a[minb + 1000] += coef;
        for (int i = 3; i <= m; i++)
        {
            cin >> coef >> time;
            a[time + 1000] += coef;
        }
        cin >> coef >> maxb;
        a[maxb + 1000] += coef;
        maxa = maxa > maxb ? maxa : maxb;
        mina = mina < minb ? mina : minb;
        maxa += 1000;
        mina += 1000;
        int j;
        for (j = maxa; j > mina; j--)
            if (a[j] != 0)
            {
                cout << a[j] << " " << j - 1000;
                break;
            }
        for (int i = j - 1; i > mina; i--)
            if (a[i] != 0)
                cout << " " << a[i] << " " << i - 1000;
        cout << endl;
    }
    return 0;
}
发表于 2018-03-25 19:22:36 回复(0)
#include<stdio.h>
int ex[2000];
int main (){//the shorter,the better.
    int i,j,n,k,m,minM;
    for(i=0;i<2&&~scanf("%d",&n);i++)
        for (j=0 ; j<n && ~scanf("%d %d",&k,&m); ex[1000+m] += k,++j);
    for (minM=2000,i = 0; i < 2000;minM=i<minM&&ex[i]?i:minM,i++);
    for (j = 1999; j>=minM;ex[j]?(j==minM?printf("%d %d\n",ex[minM],minM-1000):printf("%d %d ",ex[j],j-1000)):0,--j);
}
发表于 2018-01-13 21:39:37 回复(0)
我自己测试的用例都是对的,但是一提交运行就是错的。苦思冥想无果。然后仔细查看了测试用例!气死我了!题目明明说的是输入降序!但是测试用例是次数升序输入的!!!
发表于 2017-06-02 20:37:13 回复(2)
#include<iostream>
#include<map>
using namespace std;
int main()
{
    int m,n,a,b;
    while(cin>>m)
    {
        map<int,int> x;
        while(m--)
        {
            cin>>a>>b;
            x[b]+=a;
        }
        cin>>n;
        while(n--)
        {
            cin>>a>>b;
            x[b]+=a;
        }
        auto it=x.end();
        for(it;it!=x.begin();it--)
        {
            if(it->second!=0)
                cout<<it->second<<' '<<it->first<<' ';
        }
        it->second!=0 ? cout<<it->second<<' '<<it->first<<endl:cout<<endl;
    }
}

发表于 2018-08-17 09:09:06 回复(0)
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext()) {
			Map<Integer, Integer> firstMap = new HashMap<Integer, Integer>();
			Map<Integer, Integer> secondMap = new HashMap<Integer, Integer>();
			int n = scanner.nextInt();
			for(int i = 0; i < n; i++) {
				int xiShu = scanner.nextInt();
				int zhiShu = scanner.nextInt();
				firstMap.put(zhiShu,xiShu);
			}
			
			int m = scanner.nextInt();
			for (int i = 0; i < m; i++) {
				int xiShu = scanner.nextInt();
				int zhiShu = scanner.nextInt();
				secondMap.put(zhiShu,xiShu);
			}
			
			for(Map.Entry<Integer, Integer> entry : secondMap.entrySet()) {
				if (firstMap.containsKey(entry.getKey())) {
					int xiShuResult = firstMap.get(entry.getKey())+entry.getValue();
					if (xiShuResult == 0) {
						firstMap.remove(entry.getKey());
					}else {
						firstMap.put(entry.getKey(), xiShuResult);
					}
				}else {
					firstMap.put(entry.getKey(), entry.getValue());
				}
			}
			
		
			List<Map.Entry<Integer, Integer>> myList = new ArrayList<>(firstMap.entrySet());
			//按照Map的key进行排序
			myList.sort(Map.Entry.comparingByKey());
			
			for (int i = myList.size()-1; i >= 0; i--) {
				System.out.print(myList.get(i).getValue()+ " " + myList.get(i).getKey()+" ");
			}
		}
	}
}

发表于 2024-03-28 17:34:40 回复(0)
import sys

result = []
aa = []
for line in sys.stdin:
    dd = list(map(int, line[:-1].split()))[1:]
    aa.append(dd)

rr = sorted(aa[0][1::2] + aa[1][1::2], reverse=True)
max_exp = rr[0]
min_exp = rr[-1]

for i in range(min_exp, max_exp + 1):
    result.append([0, i])

locations = {}
for location, (conf, exp) in enumerate(result):
    # print(exp, location)
    locations[exp] = location

aa_cc = [(i, j) for i,j in zip(aa[0][0::2], aa[0][1::2])]
bb_cc = [(i, j) for i,j in zip(aa[1][0::2], aa[1][1::2])]
# print(max_exp)
for conf, exp in aa_cc + bb_cc:
    result[locations[exp]][0] += conf

resultss = ""
for conf, exp in result[::-1]:
    if conf != 0:
        # print(conf, exp)
        resultss += str(conf) + " " + str(exp) + " "
print(resultss[:-1])

发表于 2024-03-16 01:05:41 回复(0)
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

struct Node {   //多项式的项
    int xishu;  //系数
    int cishu;  //次数
    Node(int xishu, int cishu): xishu(xishu), cishu(cishu) {}
    bool operator<(const Node& node) {
        return cishu > node.cishu;
    }
};

int main() {
    int n;
    while (cin >> n) {
        vector<Node>polynomial; //多项式
        while (n--) {
            int xishu, cishu;
            cin >> xishu >> cishu;
            polynomial.emplace_back(xishu, cishu);
        }
        cin >> n;
        while (n--) {
            int xishu, cishu;
            cin >> xishu >> cishu;
            polynomial.emplace_back(xishu, cishu);
        }
        sort(polynomial.begin(), polynomial.end()); //按次数降序排序
        //合并同类项
        for (int i = 0; i < polynomial.size(); i++) {
            if (polynomial[i].cishu == polynomial[i + 1].cishu) {
                polynomial[i].xishu += polynomial[i + 1].xishu; //系数叠加
                polynomial[i + 1].xishu = 0;    //多余项系数置0
            }
        }
        for (auto i = polynomial.begin(); i != polynomial.end(); i++) {
            if (i->xishu == 0) {
                continue;   //零系数项不输出
            }
            cout << i->xishu << " " << i->cishu;
            i + 1 == polynomial.end() ? cout << endl : cout << " ";
        }
    }
    return 0;
}

编辑于 2024-03-10 22:31:10 回复(0)
#include <iostream>
#include<map>
#include<stack>
using namespace std;
int main() {
    map<int,int>mymap;
    for(int i=0;i<2;i++)
    {
     int n;
     cin>>n;
     int k,m;
    for(int j=0;j<n;j++)  {
      cin>>k>>m;//k为系数,m为次数
      mymap[m]+=k;  
      if(mymap[m]==0)
      mymap.erase(m);
    }
    }
    map<int,int>::iterator it;
    stack<int>xi;
    stack<int>ci;
    for(it=mymap.begin();it!=mymap.end();it++)
    {
        xi.push(it->second);
        ci.push(it->first);
    }
    while(!xi.empty())
    {
        cout<<xi.top()<<" "<<ci.top()<<" ";
        xi.pop();
        ci.pop();
    }
    return 0;
}
发表于 2023-03-29 14:08:31 回复(0)
#include <iostream>
#include <map>
#include <cstdio>

using namespace std;

map<int, int, greater<int>> mp; // key为次数,value为系数,key从大到小排列
map<int, int, greater<int>>::iterator it;

int main()
{
    int num;
    while (scanf("%d", &num) != EOF)
    {
        for (int i = 0; i < num; i++)
        {
            int value, key;
            scanf("%d %d", &value, &key);
            mp[key] += value; //将次数相同的系数相加。
        }
    }
    for (it = mp.begin(); it != mp.end(); it++)
        if (it->second != 0) //系数为0时不输出
            printf("%d %d ", it->second, it->first);
    mp.clear();
    return 0;
}

发表于 2023-03-15 14:17:14 回复(0)
哈希表
#include <iostream>
#include <map>
using namespace std;

int main() {
    map<int, int> mmap;
    int a, b, c;
    while (cin >> a){
        for (int i = 0; i < a; ++i){
            cin >> b >> c;
            mmap[c] = b;
        }
        cin >> a;
        for (int i = 0; i < a; ++i){
            cin >> b >> c;
            if (mmap.count(c) > 0) mmap[c] += b;
            else mmap[c] = b;
        }
        for (auto it = mmap.rbegin(); it != mmap.rend(); ++it)
            if (it->second != 0)
                cout << it->second << " " << it->first << " ";
        cout << endl;
    }
}


发表于 2023-02-27 22:51:57 回复(0)
新手小白,python3写的,可以通过测试样例,欢迎大佬提出改进建议~
import traceback
import sys

def AddPoly(lst1,lst2):

    result_lst = []
    result = []
    dic1 = {}
    dic2 = {}
   
    lst1.pop(0)
    lst2.pop(0)
    
    # 将两个poly的系数和node作为两个dic的key和value
    for i in range(0,len(lst1),2):
        dic1[lst1[i+1]]= lst1[i]
    for i in range(0,len(lst2),2):
        dic2[lst2[i+1]]= lst2[i]
    # 若两个dic的key相同,将value相加
    for i,j in dic2.items():
        if i in dic1.keys():
            dic1[i] = dic1[i] + dic2[i]
      # 将两个dic的内容更新都一个dic中
    dic2.update(dic1)
    # 查找更新后的dic中是否有系数为0的项,删除
    for i in list(dic2.keys()):
        if not dic2.get(i):
            del dic2[i]
        
    # 将dic内容按照key排序,升序排列,存为list
    result_lst = sorted(dic2.items(), reverse=True)
    # 将list中的pair拆开 按照输出要求顺序摆放
    for i in range(len(result_lst)):
        result.append(result_lst[i][1])
        result.append(result_lst[i][0])

    return result


try:
     
    digitList1 =input().strip().strip('\n').split(' ')
    digitList2 =input().strip().split(' ')
    digitList1 = list(map(lambda x:int(x), digitList1))
    digitList2 = list(map(lambda x:int(x), digitList2))
    num1 = int(digitList1[0])
    num2 = int(digitList2[0])
 
    addpoly = []
    addpoly = AddPoly(digitList1, digitList2)
    for x in addpoly:
        print(x, end=' ')

except Exception as e:
    pass


发表于 2022-04-17 15:12:19 回复(0)
这道题目什么叫降序?题目中用例的输入是负指数在前,正指数在后,而预期输出却是正指数在前,负指数在后。
发表于 2021-07-31 20:42:51 回复(0)