PAT 1002
2015-04-01 16:21
113 查看
1002. A+B for Polynomials(多项式)
计算两个多项式的和,polynomials:K N1 aN1 N2aN2 ...
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; }
相关文章推荐
- 1002. 写出这个数 (20)(数学啊 ZJU_PAT)
- pat 甲级 1002
- PAT 1002 写出这个数
- PAT 1002
- pat中文练习简单题1002. 写出这个数
- PAT1002.A+B for Polynomials
- PAT乙级1002. 写出这个数 C++
- PAT甲级1002题解
- PAT 1002 写出这个数 (20) (Basic Level)
- PAT甲级 1002 A+B for Polynomials (25)
- PAT-1002-乙
- PAT(乙级)1002 数字分类 (20)
- PAT1002. A+B for Polynomials (25)
- PAT 1002
- PAT乙级1002
- PAT乙级1002
- PAT 1002. 写出这个数 (20) —— Java
- PAT Basic Level 1002. 写出这个数 (20)
- PAT Basic practice 1002
- PAT 1002. 写出这个数 (20)