PAT 1002

1002. A+B for Polynomials(多项式)


计算两个多项式的和,polynomials:K N1 aN1 N2 aN2 ... NK aNK,k为项数,其中指数(exponents)NK, 0 <= NK < ... < N2 < N1 <=1000,系数(coefficients aNi,i=1, 2, ..., K。


Sample Input
2 1 2.4 0 3.2
2 2 1.5 1 0.5

Sample Output
3 2 1.5 1 2.9 0 3.2


注意点:
这一题应注意输出的格式:Notice that there must be NO extra space at the end of each line. Please be accurate to 1 decimal place.(在每一行的结尾没有多余的空格,系数精确到1位小数(%.1f))。

也应该注意输出按指数从大到小,特别的是系数为0时,不输出。

主要算法:

c++标准头文件中的qsort函数,
原型:
void qsort(
   void *base,
   size_t num,
   size_t width,
   int (__cdecl *compare )(const void *, const void *) 
);
 
 
  
  
   
   base
  
  
  
  

目标数组的开头。

num

元素的数组大小。

width

以字节为单位的元素大小。

compare

给比较两个数组的元素并返回值指定这些关系的一个用户提供的实例的指针。

qsort可以实现多种数据类型的快速排序,包括结构体(一级排序,二级排序),用法详见c++.qsort.
 
 
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 100005

struct pol//多项式
{
    int z;//指数
    double x;//系数
    int c;//若重复则c=1,否则c=0;
};
pol pol1[N];
pol pol2[N];
pol pol3[N];

int cmp(const void*a,const void*b)//使用qsort()对结构体进行一级排序,排序方法:升序
{
	return (*(pol*)a).z<(*(pol*)b).z?1:-1;
}


int main()
{
    int k1,k2;
    int i,j;//
    cin>>k1;
    for(i=0;i<k1;i++)
        cin>>pol1[i].z>>pol1[i].x;

    cin>>k2;
    for(i=0;i<k2;i++)
        cin>>pol2[i].z>>pol2[i].x;

	for(i=0;i<k2;i++)//置零
		pol2[i].c=0;

     for(i=0;i<k1;i++)
     {
         for(j=0;j<k2;j++)
		 {
			 if(pol1[i].z==pol2[j].z)
			 {
				 pol1[i].x+=pol2[j].x;
				 pol2[j].c=1;
		 	 
			 }
		 }

     }
	 for(i=0;i<k2;i++)
	 {
		 if(pol2[i].c==0)
		 {
			 pol1[k1].x=pol2[i].x;
			 pol1[k1].z=pol2[i].z;
			 k1++;
		 }
	 }
	 qsort(pol1,k1,sizeof(pol1[0]),cmp);
     j=0;//初始化计数器

     //for(i=0;i<k1;i++)
		 //cout<<pol1[i].z<<" "<<pol1[i].x<<" ";

	 
	 for(i=0;i<k1;i++)//排除系数为0的项
	 {
		 if(pol1[i].x!=0)
			 pol3[j++]=pol1[i];
	 }

     cout<<j;
	 for(i=0;i<j;i++)
	 {
		 cout<<" ";
	     printf("%d %.1lf",pol3[i].z,pol3[i].x);//此处有占位符!!
	 }
	 
	
    return 0;
}




下面分享一下高手的c代码:(转载: wq611403)

#include<stdio.h>
#include<string.h>
double polyRs[1001];
int main(){
  int k, nk,maxIndex;
  double ank;
  int count = 0;
  int i;
  memset(polyRs,0,sizeof(int));
  scanf("%d", &k);
  maxIndex=0;
  while(k--){
      scanf("%d%lf",&nk, &ank);
      polyRs[nk] += ank;
      if(nk>maxIndex) maxIndex = nk;
  }
  scanf("%d", &k);
  while(k--){
      scanf("%d%lf",&nk, &ank);
      polyRs[nk] += ank;
      if(nk>maxIndex) maxIndex = nk;
  }
  for (i=maxIndex;i>=0;i--)
      if (polyRs[i] != 0 ) count++;
  printf("%d", count);
  for(i = maxIndex; i >=0; i--){
      if(polyRs[i] !=0){
          printf(" %d %.1lf", i, polyRs[i]);
      }
  }
  return 0;
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值