您的位置:首页 > 编程语言 > C语言/C++

PAT 1002

2015-04-01 16:21 113 查看


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
;
pol pol2
;
pol pol3
;

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息