PAT A1009 Product of Polynomials
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
-
思路1:
开两个数组分别记录两个多项式,用一个二重循环将两个数组(多项式)的所有项相乘,结果存入另一个数组 -
code1:
#include <stdio.h>
#include <cstring>
const int maxn = 1111;
double ans[2*maxn], p1[maxn], p2[maxn];
//!!!TIPS 1
int main(){
int n, e, cnt = 0;
double c;
memset(ans, 0, sizeof(ans));
memset(p1, 0, sizeof(p1));
memset(p2, 0, sizeof(p2));
for(int i = 0; i < 2; ++i){
scanf("%d", &n);
for(int j = 0; j < n; ++j){
scanf("%d %lf", &e, &c);
if(i ==0) p1[e] = c;
else p2[e] = c;
}
}
for(int i = 0; i < maxn; ++i){
for(int j = 0; j < maxn; ++j){
if(p1[i] != 0 && p2[j] != 0) ans[i+j] += p1[i] * p2[j];
}
}
for(int i = 0; i < 2*maxn; ++i){
if(ans[i] != 0) cnt++;
}
printf("%d", cnt);
// for(int i = maxn-1; i >= 0; --i){ //!!!:WEONG 1
for(int i = 2*maxn; i >= 0; --i){
if(ans[i] != 0){
printf(" %d %.1lf", i, ans[i]);
// if(i != 0) printf(" "); //!!!:WRONG 2
}
}
}
- TIPS 1: -> Wrong 1
ans[]存储的是结果,两个多项式相乘,指数为和,要开到2000以上,指数最大值为1000+1000 - Wrong 2:
输出格式控制错误,本题分两部分输出,故可以先输出cnt,再循环输出_ i _ ans[i]
(_为空格)
因为结果多项式可能没有指数为0的项,所以不可以if(i != 0)
,可改为:
if(cnt > 1){
cnt--;
printf(" ");
}
- 思路2: 改进
第二次输入时,边输入边计算,输入1项就循环和多项式1的全部项相乘,并将结果累加入结果数组ans[] - code2:
#include <stdio.h>
const int maxn = 1100;
struct Ploy{
int e;
double c;
}ploy[maxn];
double ans[2*maxn] = {0};
int main(){
int n, n2, cnt = 0;
scanf("%d", &n);
for(int i = 0; i < n; ++i){
scanf("%d %lf", &ploy[i].e, &ploy[i].c);
}
scanf("%d", &n2);
for(int i = 0; i < n2; ++i){
int e1;
double c1;
scanf("%d %lf", &e1, &c1);
for(int j = 0; j < n; ++j){
//与第一个多项式每一项相乘,结果“累加”入ans对应位置
ans[e1 + ploy[j].e] += c1 * ploy[j].c;
}
}
for(int i = 0; i < 2*maxn; ++i){
if(ans[i] != 0) cnt++;
}
printf("%d", cnt);
for(int i = 2*maxn - 1; i >= 0; --i){
if(ans[i] != 0){
printf(" %d %.1lf", i, ans[i]);
}
}
}
- T2 code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2010; //Wrong1:乘法结果 最高次项可能1000+1000 = 2000
double poly[maxn], ans[maxn];
int main(){
int n, ex, cnt = 0;
double co;
for(int i = 0; i < 2; ++i){
scanf("%d", &n);
for(int j = 0; j < n; ++j){
scanf("%d %lf", &ex, &co);
if(i == 0) poly[ex] = co;
else{
for(int k = 0; k < maxn; ++k){
if(poly[k]) ans[k+ex] += co * poly[k];
}
}
}
}
for(int i = 0; i < maxn; ++i)
if(ans[i]) cnt++;
printf("%d", cnt);
for(int i = maxn; i >= 0; --i){
if(ans[i]) printf(" %d %.1f", i, ans[i]);
}
return 0;
}