PAT 甲级 1002 易懂题解

在这里插入图片描述

Solution:

这道题给出两个多项式的系数和指数,让我们求两个多项式相加的和。
我们可以用a1和b1数组分别存储第一个多项式的指数和系数,a2和b2数组分别存储第二个多项式的指数和系数。再将两个多项式相加后各项的系数存入xishu数组。重点:我们需要记录两个多项式中的指数最大项的指数max和指数最小项的指数min,于是合并后的指数范围就为min~max。
我们遍历这个指数范围,把系数不为0的项的系数输出,并且这个项的指数一定要是在第一个多项式或第二个多项式中出现过的,即visit[]为1,否则,就不用输出,因为如果这个指数在两个式子中都没有出现过,那再合并后的式子中也一定不会出现。

  • 本题的数据特别坑,一定要注意输出格式!!!
#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std;

int a1[15],a2[15];
double b1[15],b2[15];
double xishu[1005];//最终结果的系数
int visit[1005];//访问数组

int main(){
  int k1,k2;//k1为第一个多项式的k,k2为第二个多项式的k
  cin>>k1;
  int max1,min1;//max1为两个多项式中的最大项指数
                //min1为两个多项式中的最小项指数
  for(int i=0;i<k1;i++){//读入第一个数的指数和系数
    cin>>a1[i]>>b1[i];
  }

  max1=a1[0];//a1[0]肯定为第一个多项式的指数最大项
  min1=a1[k1-1];//a1[k1-1]肯定为第一个多项式的指数最小项

  cin>>k2;
  for(int i=0;i<k2;i++){//读入第二个多项式1
    cin>>a2[i]>>b2[i];
  }

  max1=max(max1,a2[0]);
  min1=min(min1,a2[k2-1]);//求出两个多项式的指数最大项和最小项

  for(int i=0;i<1005;i++){//初始化xishu[]和visit[]
    xishu[i]=0;
    visit[i]=0;
  }

  for(int i=0;i<k1;i++){//合并两个多项式指数相同的项,将合并后的系数存入xishu数组
    for(int j=0;j<k2;j++){
        if(a1[i]==a2[j]){
            xishu[a1[i]]=b1[i]+b2[j];
            visit[a1[i]]=1;//标记该指数已访问
        }
    }
  }

  for(int i=0;i<k1;i++){//将第一个多项式中没有合并的项的系数存入xishu数组
    if(visit[a1[i]]==0){
        xishu[a1[i]]=b1[i];
        visit[a1[i]]=1;//标记该指数已访问
    }
  }

  for(int i=0;i<k2;i++){//第二个多项式也一样
    if(visit[a2[i]]==0){
        xishu[a2[i]]=b2[i];
        visit[a2[i]]=1;
    }
  }

  int cnt=0;//cnt为合并后的所有非0系数项有多少个
  for(int i=min1;i<=max1;i++){
    if(visit[i]==1&&xishu[i]!=0){
        cnt++;
    }
  }

  if(cnt==0){//若两个多项式相加等于0,直接返回0
    cout<<0;
    return 0;
  }

  cout<<cnt<<' ';
  for(int i=max1;i>=min1;i--){
    if(i!=min1&&visit[i]==1){//若不为最后一项
      if(xishu[i]==0){//若系数为0,直接跳过
        continue;
      }
      cout<<i<<' ';

      int flag=true;//这里就是非常坑的点,因为若
                    //某一项的后面所有项都为0
                    //这一项后面就不能输出空格
                    //所以要用一个flag来判断
      for(int j=i-1;j>=0;j--){
        if(xishu[j]!=0){
            flag=false;
            break;
        }
      }
      if(flag){//某一项的后面项全为0
        cout<<fixed<<setprecision(1)<<xishu[i];
        return 0;
      }else{
        cout<<fixed<<setprecision(1)<<xishu[i]<<' ';
      }
    }else if(i==min1&&visit[i]==1){//若是最后一项
      if(xishu[i]==0){
        continue;
      }
      cout<<i<<' ';
      cout<<fixed<<setprecision(1)<<xishu[i];
    }
  }
  return 0;

}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44123362/article/details/89367792