7-2 一元多项式的乘法与加法运算 (20 分)(思路加详解+map做法)map真香啊 各个测试点的用例子 来吧宝贝!

一:题目

设计函数分别求两个一元多项式的乘积与和。

输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

二:补充测试用例

测试点2:

2 1 2 1 0
2 1 2 -1 0

测试用力3:

2 -1000 1000 1000 0	
2 1000 1000 -1000 0

测试用例4:

0
0 1 2 3

三:思路

思路:用map<int,int>进行 存储数据;在处理乘积的时候 一个系数 对应一个指数,
若指数相同 对系数进行累加
处理多项式和的运算同理

四:上码

/**
 	思路:用map<int,int>进行 存储数据;在处理乘积的时候 一个系数  对应一个指数,
	 	  若指数相同 对系数进行累加 


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

int main(){
	int N,M;
	int arr1[1001],arr2[1001];
//	map<int,int>m;
	std::map<int, int, std::greater<int> > m,m2;  //map默认的递增 ,这样改成递减的 
//在创造map时,增加参数 **std::greater<int>**,就变成增加

	map<int,int>::iterator t; 
	
	cin >> N;
	
	for(int i = 0; i < 2 * N; i++){
		int nums;
		cin >> nums;
		arr1[i] = nums;
	}
	
	cin >> M;
	
	for(int i = 0; i < 2 * M; i++){
		int nums;
		cin >> nums;
		arr2[i] = nums; 
	}
	
//	4 3 4 -5 2  6 1  -2 0
//  3 5 20  -7 4  3 1
	
	//计算乘积 
	for(int i = 0; i < 2 * N - 1; i = i + 2){
		for(int j = 0; j < 2 * M - 1; j = j + 2){
			
			int temp1 = arr1[i + 1] + arr2[j + 1]; //指数相加 
			int temp2 = arr1[i] * arr2[j];//系数相乘 
			
			m[temp1] += temp2;//一个指数  对应系数(如果有指数相同的则累加) 			
		}
	}
	
	int flag = 0; 

	if(N == 0 || M == 0){
		cout << "0 0";
	}else{
	
		for(t = m.begin(); t != m.end(); t++){
			
			if(flag == 0 && t->second != 0)//这里的t->second != 0 说的是系数不为0,一旦为0,就什么也不输出 
				cout << t->second << ' ' <<  t->first;
			else if(t->second != 0){
				cout << ' ' << t->second << ' ' << t->first; 
			}	
			flag = 1;
			
		} 
	
    }
	cout << endl;
	
	//计算多项式的和
	for(int i = 0; i < 2 * N - 1; i = i + 2){
		m2[arr1[i+1]] = arr1[i]; 
	} 
	for(int i = 0; i < 2 * M - 1; i = i + 2){
		m2[arr2[i+1]] += arr2[i];//如果遇见指数相同的系数相加 
	}
	
	int flag1 = 0; 
	int count = 0;
		
	if(M == 0 && N == 0){
		cout << "0 0";
	}else{

		for(t = m2.begin(); t != m2.end(); t++){
			
			if(flag1 == 0 && t->second != 0)
				cout << t->second << ' ' <<  t->first;
			else if(t->second != 0){
				cout << ' ' << t->second << ' ' << t->first; 
			}	
			flag1 = 1;
			
			if(t->second == 0){
				count++;
			}
			
		} 	
   }
   
   if(count == m2.size()){//测试点三
   	cout << "0 0";
   }
	
	
} 

//测试用例子 2(测试点2) 
//2 1 2 1 0
//2 1 2 -1 0

//测试点3用例子 
// 2 -1000 1000 1000 0	
// 2 1000 1000 -1000 0

//测试点4的例子
// 0
// 0 1 2 3



在这里插入图片描述

五:知识速递(如果对于map的用法不了解的兄弟们,可以学一下啊)

map的基本用法

最后加油Boy!!! 刷题源于热爱 , 顺便服务与以后的工作,学到老,刷到老!!!!!!!!!!

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天向上的菜鸡杰!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值