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 N1 aN1 N2 aN2 ... NK aNK
where K is the number of nonzero terms in the polynomial, Ni and aNi (i=1,2,⋯,K) are the exponents and coefficients, respectively. It is given that 1≤K≤10, 0≤NK<⋯<N2<N1≤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 ≤ NK < ⋯ < N2 < N1 ≤ 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])