【PAT】1009 Product of Polynomials (25 分)——多项式乘法

该博客介绍了两种实现多项式加法的C++代码,通过存储系数而非完整的多项式来优化内存使用。第一种方法保留了原始多项式,第二种方法仅用一个数组存储结果,避免了额外存储。两种方法都利用了指数相加的原理,减少了计算步骤。
//学习多项式加法的思想
//多项式没有必要存储,只需要存储结果 res[指数]=系数
//此处因为两多项式不应存在结果中,所以还是需要存一下第一个多项式
//第二个多项式在读入时顺便就计算了

#include <iostream>
#include <vector>
#define MAXN 2010//注意因为指数相加,结果的下标最大可以取到2000
using namespace std;

double coefficients[MAXN];
int a[MAXN];
double b[MAXN];

int main(){
  int k1,k2;
  scanf("%d",&k1);

  int tmpe;
  double tmpc;
  for(int i=0;i<k1;i++){
    scanf("%d %lf",&a[i],&b[i]);
  }

  scanf("%d",&k2);
  for(int i=0;i<k2;i++){
      scanf("%d %lf",&tmpe,&tmpc);
      for(int i=0;i<k1;i++){
        coefficients[tmpe+a[i]]+=(tmpc*b[i]);
    }
  }

  int cnt=0;
  for(int i=0;i<MAXN;i++){
    if(coefficients[i]!=0){
      cnt++;
    }
  }

  printf("%d",cnt);
  for(int i=MAXN-1;i>=0;i--){
    if(coefficients[i]!=0){
      printf(" %d %.1f",i,coefficients[i]);
    }
  }

  return 0;
}
//柳姐解法
#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;//如果arr[]==0,则ans[]仍然还是0,所以不会多乘
      //因此arr没必要存两个数组,可以节省一个下标的空间
    }
  }
  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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值