原题传送链接
题目描述:
1002 A+B for Polynomials (25 分)
This time, you are supposed to find A+B where A and B are two polynomials.
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<⋯
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.
2 1 2.4 0 3.2
2 2 1.5 1 0.5
3 2 1.5 1 2.9 0 3.2
题目意思是:
输入两行关于多项式的信息:第一个数是每行的项数K(0<=k<=10),其后有2*k个数字,表示项的次数(整数)N和系数(小数)a
k N1 a1 N2 a2 ... ... Nk ak;
其中Ni和ai都是[0,1000]而Ni取整数,ai取小数。
要求输出这两行多项式的和,输出格式和输入类似,先输出多项式的项数,再按照次数从大到小的顺序输出项的幂和系数,系数取小数点后一位。
我的代码:
#include
#include
#include
using namespace std;
int main(){
//设置三个数组对数据进行存储
float a[1005], b[1005], c[1005];
int k, i;
//初始化数组,
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
cin >> k;
while(k--){
int i = 0;
cin >> i;
cin >> a[i];
}
cin >> k;
while(k--){
i = 0;
cin >> i;
cin >> b[i];
}
//将两数组数据整合一起
for(i = 0; i < 1005; i++){
c[i] = a[i] + b[i];
}
//统计一共有多少系数大于零的多项式
int count = 0;
for(i = 0; i < 1005; i++){
if(c[i] != 0){
count++;
}
}
cout << count;
for(i = 1005; i >= 0; i--) {
if(c[i] != 0){
//注意输出的空格格式,不可多也不可少
cout<<" "<< i << " ";
printf("%.1f",c[i]);
}
}
return 0;
}
经过几次修改上面的代码总算通过了所有的测试点数据,有以下几点注意的。
1、首先输入输出格式,输出要求每个数字相隔一位空格而最后一位数字后不能有空格,所有我将空格放在数字的前面来隔开输出,还有系数按小数点后一位输出,使用C中的printf来控制即可解决。
2、输入的两行数据中多项式的项不一定全部相同,所以要分别相加,而且项的幂最大可以到1000,这一点很重要,因为在一开始我一位项的次数最多和K值一样导致有一个测试用例一直过不了,后来回看题目才发现问题;于是把数组和循环的数据判断都改成了1005,测试才能全部通过。
3、事实上我的代码还能够继续优化,在空间复杂度上和时间复杂度上;比如可以用一个数组来存储数据,直接将输入的数据加进去就可以了,其他的日后看到再说吧。