02-线性结构2 一元多项式的乘法与加法运算 (20分)

两种方法

1

#include <iostream>
using namespace std;
struct node
{
	int x, y;
} P[2005];
//第一个用结构体 第二个直接输入
//用指数做下标 方便查找计算
int main()
{
	int a, b, A[2005] = {0}, B[2008] = {0};
	cin >> a;
	int t1, t2;
	for (int i = 0; i < a; i++)
	{
		cin >> P[i].x >> P[i].y;
		//B是用来求和
		B[P[i].y] += P[i].x;
	}
	cin >> b;
	for (int i = 0; i < b; i++)
	{
		cin >> t1 >> t2;
		//直接加到以t2为下标的元素里了
		B[t2] += t1;
		for (int j = 0; j < a; j++)
		{
			//A是求乘积
			//遍历第一个式子
			//指数相加 系数相乘
			A[t2 + P[j].y] += (t1 * P[j].x);
		}
	}
	//做标记用
	int is = 1, h = 0;
	for (int i = 2000; i >= 0; i--)
	{
		if (A[i] != 0)
		{
			if (!is)
				cout << ' ' << A[i] << ' ' << i;
			else
			{
				is = 0;
				cout << A[i] << ' ' << i;
			}
			h = 1;
		}
	}
	if (!h)
		cout << "0 0";
	cout << endl;
	h = 0, is = 1;
	for (int i = 1000; i >= 0; i--)
	{
		if (B[i] != 0)
		{
			if (!is)
			{
				cout << ' ' << B[i] << ' ' << i;
			}
			else
			{
				is = 0;
				cout << B[i] << ' ' << i;
			}
			h = 1;
		}
	}
	if (!h)
		cout << "0 0";
	cout << endl;
	return 0;
}

2

用结构体来记录下标和指数 查询比较麻烦

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAX_N = 1e5;
struct node
{
	int x;
	int z;
};
int N_1, N_2;
node *read(int n)
{
	node *polynomial;
	polynomial = (struct node *)malloc(sizeof(struct node) * MAX_N);
	for (int i = 0; i < n; i++)
	{
		int x, y;
		cin >> x >> y;
		polynomial[i].x = x;
		polynomial[i].z = y;
	}
	return polynomial;
}
void sum(node polynomial_1[], node polynomial_2[])
{
	int t = 0;
	int index = 0;
	node poly[MAX_N];
	int i, j;
	for (i = 0; i < N_1; i++)
	{
		for (j = t; j < N_2; j++)
		{
			if (polynomial_1[i].z == polynomial_2[j].z)
			{
				poly[index].z = polynomial_1[i].z;
				poly[index++].x = polynomial_2[j].x + polynomial_1[i].x;
				if (poly[index - 1].x == 0)
				{
					index--;
				}
				t++;
				break;
			}
			else if (polynomial_1[i].z > polynomial_2[j].z)
			{
				poly[index++] = polynomial_1[i];
				break;
			}
			else
			{
				poly[index++] = polynomial_2[j];
				i--;
				t++;
				break;
			}
		}
		if (t == N_2)
		{
			int p;
			p = (i == 0 ? 0 : i + 1);
			for (; p < N_1; p++)
			{
				poly[index++] = polynomial_1[p];
			}
			break;
		}
	}
	if (t != N_2)
	{
		for (int p = t; p < N_2; p++)
			poly[index++] = polynomial_2[p];
	}
	if (poly[0].x == 0)
	{
		cout << "0 0\n";
		return;
	}
	for (int i = 0; i < index; i++)
	{
		cout << poly[i].x << ' ' << poly[i].z;
		if (i != index - 1)
			cout << ' ';
	}
}
void multiply(node polynomial_1[], node polynomial_2[])
{
	int index = 0;
	node poly[MAX_N];
	for (int j = 0; j < N_2; j++)
	{
		for (int i = 0; i < N_1; i++)
		{
			poly[index].x = polynomial_1[i].x * polynomial_2[j].x;
			poly[index++].z = polynomial_1[i].z + polynomial_2[j].z;
			if (poly[index - 1].x == 0)
				poly[index - 1].z = 0;
		}
	}
	for (int i = 0; i < index; i++)
	{
		for (int j = i + 1; j < index; j++)
		{
			if (poly[i].z == poly[j].z)
			{
				poly[i].x += poly[j].x;
				if (poly[i].x == 0)
					poly[i].z = -1;
				poly[j].z = -1;
			}
		}
	}
	if (poly[0].x == 0)
	{
		cout << "0 0\n";
		return;
	}
	for (int i = 0; i < index; i++)
	{
		if (poly[i].z == -1)
			continue;
		if (i != 0)
			cout << ' ';
		cout << poly[i].x << ' ' << poly[i].z;
	}
	printf("\n");
}
int main()
{
	node *polynomial_1, *polynomial_2;
	cin >> N_1;
	polynomial_1 = read(N_1);
	cin >> N_2;
	polynomial_2 = read(N_2);
	multiply(polynomial_1, polynomial_2);
	sum(polynomial_1, polynomial_2);
	return 0;
}
发布了106 篇原创文章 · 获赞 25 · 访问量 7209

猜你喜欢

转载自blog.csdn.net/weixin_45653525/article/details/104495551
今日推荐