这题要注意数组越界的问题(第一次提交的时候就是数组越界了)
两种方法:
- 只用a[e] = c的形式存储多项式,这样会略麻烦;
- 第一个多项式利用结构体表示,然后结果放在a[e]中;(这个代码简洁)
方法一代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
const int max_n = 2005;
int main(){
double p[max_n+100] = {0};
double q[10][max_n+100] = {0};
int n,count=0;
double a; //系数
int k;
scanf("%d",&k);
for(int i=0;i<k;i++){
scanf("%d %lf",&n,&a);
p[n] = a;
}
scanf("%d",&k);
for(int i=0;i<k;i++){
scanf("%d %lf",&n,&a);
for(int j=0;j<max_n;j++){
q[i][j+n] = p[j]*a;
}
}
double h[max_n+100] = {0};
for(int i=0;i<k;i++){
for(int j=0;j<max_n;j++){
h[j] += q[i][j];
}
}
for(int i=0;i<max_n;i++){
if(h[i]!=0){
count++;
}
}
printf("%d",count);
for(int i=max_n-1;i>=0;i--){
if(h[i]!=0){
printf(" %d %.1f",i,h[i]);
}
}
return 0;
}方法二代码:
还有一种用结构体的写法:
#include<cstdio>
#include<algorithm>
struct Poly{
int exp; //指数
double cof; //系数
}poly[1001]; //代表第一个多项式
int main(){
int count = 0;
double ans[2001] = {0}; //用来存放结果,因为相乘的最大系数为2000所以数组最小开到2001
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){ //读入第一个多项式
scanf("%d %lf",&poly[i].exp,&poly[i].cof);
}
int m;
scanf("%d",&m);
for(int i=0;i<m;i++){ //计算结果
int exp;
double cof;
scanf("%d %lf",&exp,&cof);
for(int j=0;j<n;j++){ //读取到的每一项与第一个多项式相乘,加到ans[]中
ans[exp + poly[j].exp] += cof*poly[j].cof;
}
}
for(int i=0;i<2001;i++){
if(ans[i]!=0){
count++;
}
}
//输出
printf("%d",count);
for(int i=2000;i>=0;i--){
if(ans[i]!=0.0){
printf(" %d %.1f",i,ans[i]);
}
}
return 0;
}
京公网安备 11010502036488号