PAT 甲级测试题目 -- 1002 A+B for Polynomials
题目地址
题目大意:输入两个多项式,每个多项式输入包含该多项式的项数,以及每项的指数和系数,将两个多项式中指数相同的系数相加。输出结果多项式的项数,按指数从大到小输出多项式中每项的指数和系数,并保留一位小数,输出格式和输入格式保持一致。
思路:
思路:用两个大小为1001的数组分别记录被用到的指数以及指数对应的系数之和,遍历输出。时间上要遍历三个1001次for循环分别用于两个数组的初始化以及哪些指数被用到了,属于较为时空复杂度较高且麻烦但是容易理解的思路。
代码
#include<iostream>
#include<iomanip>
using namespace std;
void EnterCal(double * coefficients, int * Ks, int & index, int & number) {
double temp;
int terms;
cin >> terms;
for (int i = 0; i < terms; i++) {
double temp;
cin >> index;
if (Ks[index] != 1) {
number++;
Ks[index] = 1;
}
cin >> temp;
coefficients[index] += temp;
if (coefficients[index] == 0)
number--;
}
}
int main() {
int index;
double coefficients[1001];
int Ks[1001], terms;
int number = 0;
for (int i = 0; i < 1001; i++) {
Ks[i] = 0;
coefficients[i] = 0;
}
EnterCal(coefficients, Ks, index, number);
EnterCal(coefficients, Ks, index, number);
cout << number;
if (number != 0)
cout << " ";
for (int i = 1000; i >= 0; i--)
{
if (Ks[i] != 0 && coefficients[i]!= 0 ) {
cout << i << " " << fixed << setprecision(1) << coefficients[i] + pow(10, -14);
number--;
if (number > 0)
cout << " ";
}
}
return 0;
}
坑点:
题目中没有明确说明但要求:在多项式计算过后没有项数的时候,应输出0,也就是只输出项数,并不输出指数以及系数,依据估计是藏在要求输出格式和输入格式一致这里。。。
有时间的话我试着用 C++ 中类似键值对的数据记录方式,应该会很大程度上减少时空复杂度,有时间更