1002. A+B for Polynomials (25)
This time, you are supposed to find A+B where A and B are two polynomials.
Input
Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial: K N1 aN1 N2 aN2 ... NK aNK, where K is the number of nonzero terms in the polynomial, Ni and aNi (i=1, 2, ..., K) are the exponents and coefficients, respectively. It is given that 1 <= K <= 10,0 <= NK < ... < N2 < N1 <=1000.
Output
For each test case you should output the sum of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate to 1 decimal place.
Sample Input2 1 2.4 0 3.2 2 2 1.5 1 0.5Sample Output
3 2 1.5 1 2.9 0 3.2
这道题目中说明了,多项式的次数不会超过1000,这样最简便的方法就是对号入座,创建一个大小为1005的数组a[1005],则a_n*X_n,对应的,a[n]=a_n;
代码如下:
#include <stdio.h>
#include<string.h>
int main()
{
float a[1001];
int i,k;
float temp;
// 初始化数组
for(i = 0; i <= 1000; i++){
a[i] = 0.0f;
}
// 分别输入两个多项式
scanf("%d", &k);
while(k--){
scanf("%d%f", &i, &temp);
a[i] += temp;
}
scanf("%d", &k);
while(k--){
scanf("%d%f", &i, &temp);
a[i] += temp;
}
// 判断当前多项式的项数
k = 0;
for(i = 0; i <= 1000; i++){
if(a[i]!=0.0){
k++;
}
}
printf("%d", k);
// 项数为0则只输出k,且不带空格
if(k != 0)
printf(" ");
for(i=1000; i >= 0; i--){
if(a[i]!=0.0){
printf("%d ", i);
printf("%0.1f", a[i]);
k--;
// 输出最后一项后不带空格
if(k != 0)
printf(" ");
}
}
return 0;
}
主要存在几个点:
可以输入重复的项
输入的项相加后可能为0,此时项数减1
当项目为0时,只输出项数,不要加空格
输出最后一项不要加空格
最终的结果多项式项数最多为20
为了节省存储空间,也写了一段空间代价较小的代码,但是这段代码有点丑,用结构体数组会优美很多
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main() {
int SE[21],AE[11],BE[11];
double SC[21],AC[11],BC[11];
int a,b,c;
while(cin>>a) {
memset(AE,0,sizeof(AE));
memset(AC,0,sizeof(AC));
memset(BE,0,sizeof(BE));
memset(BC,0,sizeof(BC));
for(int i=0; i<a; i++) {
cin>>AE[i]>>AC[i];
}
cin>>b;
for(int i=0; i<b; i++) {
cin>>BE[i]>>BC[i];
}
int i=0,j=0;
c=0;
while(i<=a-1||j<=b-1) {
if(AE[i]>BE[j]) {
SE[c]=AE[i];
SC[c]=AC[i];
i++;
c++;
}
else if(BE[j]>AE[i]) {
SE[c]=BE[i];
SC[c]=BC[i];
j++;
c++;
}
else{
SE[c]=AE[i];
SC[c]=AC[i]+BC[j];
i++;
j++;
if(SC[c]!=0)c++;
}
}
printf("%d",c);
//cout<<c;
for(i=0;i<c;i++){
//cout<<" "<<SE[i]<<" "<<SC[i];
printf("*%d*%.1f",SE[i],SC[i]);
}
//cout<<endl;
printf("\n");
}
}