[PAT甲级]A1009Product of Polynomials,C++

一、原题地址:PAT_A1009

二、题目描述:

[PAT甲级]A1009Product of Polynomials,C++_第1张图片

三、题目大意:给出两个多项式A和B,要求你计算A X B的结果;测试用例给出两行,每一行是一个多项式的信息K  N1a1 N2a2 ...Nkak;其中K是多项式非零项的个数 N是每一项的幂(指数) a是每一项的系数;输出要求和输入同样格式(先给出非零项个数K,然后给出各项的幂和系数,按照幂递减排序),系数保留一位小数,最后无空格。

四、代码:

#include
#include
using namespace std;
int main()
{
	double pn[1024] = { 0 }, res[2048] = { 0 };
	int ct = 0, maxe = 0, maxE = 0;	//maxe是多项式A的最大幂 maxE是结果多项式的最大幂
	int k;
	cin >> k;
	int exp;
	double coe;
	for (int i = 0; i < k; i++)
	{
		cin >> exp >> coe;
		if (exp > maxe) maxe = exp;
		pn[exp] = coe;
	}
	cin >> k;
	for (int i = 0; i < k; i++)
	{
		cin >> exp >> coe;
		double temp;
		for (int j = 0; j <= maxe; j++)
		{
			if (pn[j] != 0)
			{
				temp = coe * pn[j];
				if (j + exp < 2048)
				{
					res[j + exp] += temp;
					if (j + exp > maxE) maxE = j + exp;
				}
				
			}
		}
	}

	for (int i = 0; i <= maxE; i++)
	{
		if (res[i] != 0) ct++;
	}
	cout << ct;

	for (int i = maxE; i >= 0; i--)
	{
		if (res[i] != 0)
			cout << " " << i << " " << fixed << setprecision(1) << res[i];
	}
	system("pause");
	return 0;
}

五、分析和注意点:

  • 解题思路很简单,因为幂是整数,系数是浮点,因此声明一个double数组来存储系数,下标就是幂;根据多项式的乘法,多项式A的每一项要分别乘以B的每一项,相乘时系数相乘,幂相加;所以声明一个pn数组来存放A的信息,res数组存放相乘结果,B在边输入每一项的时候,就与A的所有项相乘,结果存入res中就可以了;
  • 此题犯了一个段错误,原因是题中说明N的取值在[0,1000],开始将res数组大小设置成[1024],这时不够的,因为AXB的某一项的幂等于两个项幂的和,因此res数组的取值范围应该是[0,2000]。

你可能感兴趣的:(PAT)