含泪补基础
1002 A+B for Polynomials(多项式存储,保留确定小数位输出)
1. 题目描述
这个题目我理解了挺久:
其实就是,有两个多项式A和B,分别为两行,第一行的第一个数字是A的多项式个数,第一行后面每两项分别为指数和系数。这里我们只需要把A和B中指数相同的项,系数相加就可以了,然后从大到小输出不为0的项。
This time, you are supposed to find A+B where A and B are two polynomials.
Input Specification:
Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial:
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 Specification:
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. 解题思路
- 时间空间复杂度都在范围内,不需要考虑
- 存储两个多项式,可以用数组来存储,例如a[1] = 2.4,存储对应项的系数即可。
- 再用一个sum数组,存储系数相加后的结果
- 注意在输出时,需要输出多项式的项数,因此在遍历sum时,需要判断不为0的项,并用cnt计数。
3. 参考代码
/*
1001
A+B for Polynomials (25 分)
*/
#include <iostream>
#include <string>
using namespace std;
int main()
{
double a[1005] = {0}, b[1005]={0}, sum[1005]={0};
int n, x;
double y;
// 读入第一行数据
// cin>>n;
scanf("%d", &n);
for(int i=0; i<n; i++){
// cin >> x >> y;
scanf("%d %lf", &x, &y);
a[x] = y;
}
// 读入第二行数据
cin>>n;
for(int i=0; i<n; i++){
// cin >> x >> y;
scanf("%d %lf", &x, &y);
b[x] = y;
}
// 系数相加, 求cnt
int cnt = 0;
for(int i=0; i<=1000; i++){
sum[i] = a[i] + b[i];
if(sum[i] != 0){
cnt++;
}
}
cout << cnt;
// 注意从大的项开始输出
for(int i=1000; i>=0; i--){
if(sum[i]!=0){
// cout << " " << i << " " << sum[i];
printf(" %d %.1lf", i, sum[i]); // 输出注意只保留一位小数
}
}
return 0;
}
补充知识,保留确定小数位输出
- 方法一:用printf,使用常见的 %.1f即可
- 方法二:如果用cout,则需要在小数前输出<< setprecision(1) <<,并且导入头文件#include <iomanop>
以上就是对于本题的解题思路了,如果你觉得我的文章对你有用请点个赞支持一下吧。如果此文章有错误或者有不同的见解欢迎评论或者私信。wink~