PAT 1002

来源:互联网 发布:php单例模式的特点 编辑:程序博客网 时间:2024/05/14 16:04

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 100005struct 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