1009  Product of Polynomials (25分)

Product of Polynomials

This time, you are supposed to find A×B where A and B are two polynomials.

Input Specification:

Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial:

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

where K is the number of nonzero terms in the polynomial, N​i​​ and a​N​i​​​​ (i=1,2,⋯,K) are the exponents and coefficients, respectively. It is given that 1≤K≤10, 0≤N​K​​<⋯<N​2​​<N​1​​≤1000.

Output Specification:

For each test case you should output the product of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate up to 1 decimal place.

Sample Input:

2 1 2.4 0 3.2
2 2 1.5 1 0.5

Sample Output:

3 3 3.6 2 6.0 1 1.6

题意:两个多项式的相乘

思路: 

 标记数组,此题中 0 ≤ N​K ​​< ⋯ < N​2​​ < N​1 ​​≤ 1000(Ni 为指数,多项式相乘,指数相加),数组至少要开到 2001;

1. double 类型分别保存多项式 a 和多项式 b,将相乘结果保存到多项式 c 中,最后按照指数递减的顺序输出所有不为0的项,空间复杂度较大(c++代码1) ,可优化

2. double 类型的 arr 数组保存第一组数据,ans数组保存结果。当输入第二组数据的时候,一边进行运算一边保存结果。后按照指数递减的顺序输出所有不为0的项~(c++代码2)

c++代码1:

#include<iostream>
using namespace std;
double a[5050]={0}, b[5050]={0}, c[5050]={0};
int main(){
	int n, m, t=0;
	scanf("%d", &n);
	for(int i = 0; i < n; i++){
		int index;
		double num;
		scanf("%d%lf", &index, &num);
		a[index] = num;
	}
	scanf("%d", &m);
	for(int i = 0; i < m; i++){
		int index;
		double num;
		scanf("%d%lf", &index, &num);
		b[index] = num;
	}
	for(int i = 0; i < 5050; i++){
		if(a[i] != 0){
			for(int j = 0; j < 5050; j++){
				if(b[j] != 0){
					int x;		double sum;
					sum = a[i]*b[j];
					x = i+j;
					c[x] += sum;
				}
	 		}
		}	
	}
	for(int i = 5050; i >= 0; i--)
		if(c[i] != 0)	t++;
	printf("%d", t);
	for(int i = 5050; i >= 0; i--)
		if(c[i] != 0)	printf(" %d %.1f", i, c[i]);
	return 0;
}

c++代码2:

#include <iostream> 
using namespace std; 
int main() {    
	int n1, n2, a, cnt = 0;    
	scanf("%d", &n1);    
	double b, arr[1001] = {0.0}, ans[2001] = {0.0};   
	for(int i = 0; i < n1; i++) {        
	 	scanf("%d %lf", &a, &b);        
		arr[a] = b;    
	}    
	scanf("%d", &n2);    
	for(int i = 0; i < n2; i++) {       
		scanf("%d %lf", &a, &b);        
		for(int j = 0; j < 1001; j++)                
			ans[j + a] += arr[j] * b;    
	}    
	for(int i = 2000; i >= 0; i--)        
		if(ans[i] != 0.0) cnt++;    
	printf("%d", cnt);    
	for(int i = 2000; i >= 0; i--)        
		if(ans[i] != 0.0)            
			printf(" %d %.1f", i, ans[i]);    
	return 0; 
}

Python代码: 

if __name__ == "__main__":
line=input().split(" ")
num=int(line[0])
dic1={}
for x in range(num):
dic1[int(line[2 * x+1])] = float(line[2*x+2])
line=input().split(" ")
num=int(line[0])
dic2={}
for x in range(num):
dic2[int(line[2 * x+1])] = float(line[2*x+2])
dic1 = {key:value for key,value in dic1.items() if value!=0}
dic2 = {key:value for key,value in dic2.items() if value!=0}
result = [[x,0] for x in range(2001)]
for x in dic1:
for i in dic2:
result[x+i][1] += dic1[x]*dic2[i]
output = str(len([x for x in result if x[1] !=0]))+" "
for x in result[::-1]:
if x[1]!=0:
output = output + str(x[0])+" "+ "{:.1f}" .format(x[1])+" "
print(output[:-1])

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值