#数据结构与算法学习笔记#PTA5:一元多项式的乘法与加法运算(C/C++)

2018.3.20

加法挺简单的,乘法至今没有想到类似在线处理那样更好的算法,目前有几个思路:

1.把M与N项多项式乘法看成M(M<N)个多项式加法,问题转换为多项式加法问题。

2.逐项计算,并且依次进行插入,问题可以转换为顺序链表元素插入问题。

3.总体计算,计算结束之后再按指数大小进行排序。

目前采用的算法是算完再排序,一方面是几种思路复杂度差不多,另一方面是实现较简单,可读性也很强。也可能是因为本身自己手算就是这么算的,思维局限了。

坑有点多,首先是排序循环次数,然后是同类项、零项,还有输出格式等等。

还留了一个bug,没法计算负指数项。应该只要1.改动乘法排序次数,2.调用vector的erase方法,3.改一下print函数。因为跑过了题目测试,就不多做改动。欢迎评论交流更好的方法。

// Polynomial_Multi_Add.cpp : 定义控制台应用程序的入口点。
// 一元多项式的乘法与加法运算
//设计函数分别求两个一元多项式的乘积与和。
//输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
//输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <vector>


#define MAX 1000

using namespace std;

void Read(vector<int>& data);
void Print(vector<int>& data);
void Multiplication(vector<int>& d1, vector<int>& d2, vector<int>& output);
void Addition(vector<int>& d1, vector<int>& d2, vector<int>& output);

int main()
{
	vector<int> data1;
	vector<int> data2;
	vector<int> multi;
	vector<int> add;


	Read(data1);
	Read(data2);

	Multiplication(data1, data2, multi);
	Addition(data1, data2, add);

	Print(multi);
	Print(add);

	system("pause");
	return 0;
}

void Read(vector<int>& data) {
	int n, value;
	cin >> n;
	data.push_back(n);
	for (int i = 1; i <= 2 * n; i++) {
		cin >> value;
		data.push_back(value);
	}
}

void Print(vector<int>& data) {
	//零多项式输出0 0
	if (data.size() == 0 || (data[0] <= -1 && data[1] <= -1)) {
		cout << 0 << " " << 0;
	}
	else {
		for (int i = 0; i < data.size(); i += 2) {
			cout << data[i];
			cout << " ";
			cout << data[i + 1];
			//遇到标记则结束
			if (i == data.size() - 2 || (data[i + 2] <= -1 && data[i + 3] <= -1)) {
				break;
			}
			else {
				cout << " ";
			}
		}
	}
	cout << endl;
}


void Multiplication(vector<int>& d1, vector<int>& d2, vector<int>& output) {
	int count1 = 1;
	int count2 = 1;

	while (count1 <= 2 * d1[0]) {
		while (count2 <= 2 * d2[0]) {
			output.push_back(d1[count1] * d2[count2]);
			output.push_back(d1[count1 + 1] + d2[count2 + 1]);
			count2 += 2;
		}
		count1 += 2;
		count2 = 1;
	}

	//类似冒泡排序重组数组,复杂度N^2
	int t;
	for (int i = 2; i < output.size(); i += 2) {
		for (int j = 0; j < output.size() - 2; j += 2) {	
			if (output[j + 1] < output[j + 3]) {
				t = output[j];
				output[j] = output[j + 2];
				output[j + 2] = t;
				t = output[j + 1];
				output[j + 1] = output[j + 3];
				output[j + 3] = t;
			}
			//排序同时合并同类项,跳过标记
			else if (output[j + 1] == output[j + 3] && output[j+1] != -1) {
				output[j] += output[j + 2];
				if (output[j] == 0) {
					output[j] = -1;
					output[j + 1] = -1;
				}
				output[j + 2] = -1;//负标记
				output[j + 3] = -1;
			}
		}
		Print(output);		
	}

}

void Addition(vector<int>& d1, vector<int>& d2, vector<int>& output) {
	int count1 = 1;
	int count2 = 1;
	while (count1 <= 2 * d1[0] || count2 <= 2 * d2[0]) {

		//判断是否使用完其中一个多项式,若使用完,直接为output填入另一个多项式的余项
		if (count1 > 2 * d1[0]) {
			while (count2 <= 2 * d2[0]) {
				output.push_back(d2[count2]);
				count2++;
			}
			break;
		}
		else if (count2 > 2 * d2[0]) {
			while (count1 <= 2 * d1[0]) {
				output.push_back(d1[count1]);
				count1++;
			}
			break;
		}

		//先判断d1与d2指数大小关系,将累加结果填入output
		if (d1[count1 + 1] > d2[count2 + 1]) {
			output.push_back(d1[count1]);
			output.push_back(d1[count1 + 1]);
			count1 += 2;
		}
		else if (d1[count1 + 1] == d2[count2 + 1]) {
			//跳过同类项
			if (d1[count1] + d2[count2] != 0) {
				output.push_back(d1[count1] + d2[count2]);
				output.push_back(d1[count1 + 1]);
			}
			count1 += 2;
			count2 += 2;
		}
		else if (d1[count1 + 1] < d2[count2 + 1]) {
			output.push_back(d2[count2]);
			output.push_back(d2[count2 + 1]);
			count2 += 2;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_20304723/article/details/79623102
今日推荐