PAT-ADVANCED1009——Product of Polynomials

本文详细解析PAT-ADVANCED中的1009多项式乘法问题,介绍如何使用哈希表记录系数,实现高效计算。通过具体代码示例,展示C++解决多项式相乘的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的PAT-ADVANCED代码仓:https://github.com/617076674/PAT-ADVANCED

原题链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805509540921344

题目描述:

题目翻译:

1009 多项式乘法

当A和B是两个多项式时,你需要计算A * B。

输入格式:

每个输入文件包含一个测试用例。每个测试用例占2行,每行包含一个多项式的信息:

K N​1​​ a​N​1​​​​ N​2​​ a​N​2​​​​ ... N​K​​ a​N​K​​​​

其中K是多项式中非零项的个数,Ni和aNi(i = 1, 2, ..., K)分别是指数和系数。1 <= K <= 10,0 <= NK < ... < N2 < N1 <= 1000。

输出格式:

对每个测试用例,你需要在一行中输出A * B的结果,其形式和输入相同。行末不得有多余空格,系数精确到小数点后1位。

输入样例:

2 1 2.4 0 3.2
2 2 1.5 1 0.5

输出样例:

3 3 3.6 2 6.0 1 1.6

知识点:哈希表

思路:开一个大小为2001的数组记录系数

本题和PAT-ADVANCED1002——A+B for Polynomials几乎一模一样,需要注意的是,本题中乘法的最大系数会是2000。

时间复杂度是O(K1 * K2),其中K1是第一个输入多项式的非零项个数,K2是第二个输入多项式的非零项个数。空间复杂度是O(2001)。

C++代码:

#include<iostream>
#include<vector>
#include<utility>
#include<cmath>

using namespace std;

double coefficients1[1001];
double coefficients2[1001];
double coefficients[2001];
vector<pair<int, double> > results;

int main(){

	fill(coefficients1, coefficients1 + 1001, 0.0);
	fill(coefficients2, coefficients2 + 1001, 0.0);
	fill(coefficients, coefficients + 2001, 0.0);
	int K, N;
	double aN;
	scanf("%d", &K);
	for(int i = 0; i < K; i++){
		scanf("%d %lf", &N, &aN);
		coefficients1[N] += aN;
	}
	scanf("%d", &K);
	for(int i = 0; i < K; i++){
		scanf("%d %lf", &N, &aN);
		coefficients2[N] += aN;
	}
	for(int i = 0; i < 1001; i++){
		if(fabs(coefficients1[i]) >= 0.00000001){
			for(int j = 0; j < 1001; j++){
				if(fabs(coefficients2[j]) >= 0.00000001){
					coefficients[i + j] += coefficients1[i] * coefficients2[j]; 
				}
			}
		}
	}
	for(int i = 2000; i >= 0; i--){
		if(fabs(coefficients[i]) >= 0.00000001){
			results.push_back(make_pair(i, coefficients[i]));
		}
	}
	printf("%d", results.size());
	for(int i = 0; i < results.size(); i++){
		printf(" %d %.1f", results[i].first, results[i].second);
	}
	return 0;
}

C++解题报告:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值