[PAT-A 1002]A+B for Polynomials

在这里插入图片描述
题目大意:
给出两行,每行表示一个多项式,第一个数表示该多项式中系数非零项的项数,以后每两个数表示一项,这两个数分别表示该项的幂次和系数。试求两个多项式的和,并以与前面相同的格式输出结果。
样例中2 1 2.4 0 3.2 表示第一个多项式中系数非零项有两项,一次项系数为2.4,零次项系数为3.2 ,即F1(X)=2.4X+3.2
2 2 1.5 1 0.5表示第二锅多项式中非零项有两项,其中二次项系数为1.5,一次项系数为0.5,即F2(X)=1.5X^2+0.5X
所以F1(X)+F2(X)=1.5X^2+2.9X+3.2
输出为3 2 1.5 1 2.9 0 3.2

思路:
1.多项式中指数取值为[0,1000],定义double p[1010],其中p[i]表示次数为i的项的系数,初值为0
2.分别读入两个多项式,对对应项上的系数进行累加,即

(void)scanf("%d", &k);
	for (int i = 0; i < k; i++) {
		(void)scanf("%d %lf", &n, &a);
		p[n] += a;
	}

3.定义count变量,表示累加之后的结果中系数不为0的项的个数,初值为0,遍历p数组,统计p中不为0的项的个数。
4.输出:按幂次从大到小顺序输出,从p[1000]开始倒着遍历,若p[i]不为0,则输出i与p[i],其中p[i]保留一位小数。

AC代码:

//PAT_A 1002
#include<cstdio>
using namespace std;
const int maxn = 1111;
double p[maxn] = { 0 };
int main() {
	int k, n, count = 0;
	double a;
	(void)scanf("%d", &k);
	for (int i = 0; i < k; i++) {
		(void)scanf("%d %lf", &n, &a);
		p[n] += a;
	}
	(void)scanf("%d", &k);
	for (int i = 0; i < k; i++) {
		(void)scanf("%d %lf", &n, &a);
		p[n] += a;
	}
	for (int i = 0; i < maxn; i++) {
		if (p[i] != 0)count++;
	}
	printf("%d", count);
	for (int i = maxn - 1; i >= 0; i--) {
		if (p[i] != 0)printf(" %d %.1f", i, p[i]);
	}
	return 0;
}
发布了101 篇原创文章 · 获赞 1 · 访问量 3053

猜你喜欢

转载自blog.csdn.net/weixin_44699689/article/details/103938952
今日推荐