多项式运算集合

一、前言

这篇文章用来集合之前写的多项式的加减乘除多项式格式化输出器和一个用来控制它们的主程序。(主程序的源代码在后文,源代码主体部分还是在以下链接中)

二、效果

用户在输入每一个多项式之前需要提供最高项的次数,之后按规则依次输入系数,输入完成后,系统会生成一个多项式,供用户确认,若错误,可以选择重新输入。另外,用户可重复运算。

效果图如下

  • 加法运算
    在这里插入图片描述
  • 减法运算
    在这里插入图片描述
  • 乘法运算
    在这里插入图片描述
  • 除法运算
    在这里插入图片描述

三、源代码

#include <iostream>
#include <algorithm>
using namespace std;//数组首个元素为常数项

const int MAX = 100;

void polynomial_mul(double A[], int m, double B[], int n, double R[], int k)//多项式乘法
{//k = m + n -1;
	int i, j;
	for (i = 0; i < k; i++)
	{
		R[i] = 0.0;
	}
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			R[i+j] += A[i] * B[j];
		}
	}
}

void polynomial_add(double A[], int m, double B[], int n, double R[], int k)//多项式加法
{//k = max(m,n);
	int i, j;
	for (i = 0; i < k; i++)
	{
		R[i] = 0.0;
	}
	int max = m > n ? m : n;
	int min = m < n ? m : n;
	for (i = 0; i < min; i++)
	{
		for (j = 0; j < min; j++)
		{
			if (i == j)
			{
				R[i] += A[i] + B[j];
			}
		}
	}
	if(max==m)
	{ 
		for (i = min; i < k; i++)
		{
			R[i] += A[i];
		}
	}
	else
	{
		for (i = min; i < k; i++)
		{
			R[i] += B[i];
		}
	}
}

void polynomial_sub(double A[], int m, double B[], int n, double R[], int k)//多项式减法
{
	int i;
	for (i = 0; i < n; i++)
	{
		B[i] = -B[i];
	}
	polynomial_add(A, m, B, n, R, k);
}

void polynomial_div(double A[], int m, double B[], int n, double R[], int k, double L[], int l)//多项式除法
{//k = m - n + 1;l = n - 1;m > n;
	int i, j, mm, ll;
	for (i = 0; i < k; i++)      //初值
	{
		R[i] = 0.0;
	}
	ll = m - 1;
	for (i = k; i > 0; i--)
	{
		R[i - 1] = A[ll] / B[n - 1];     //除法,计算商多项式系数
		mm = ll;
		for (j = 1; j <= n - 1; j++)
		{
			A[mm - 1] -= R[i - 1] * B[n - j - 1];
			mm -= 1;
		}
		ll -= 1;
	}
	for (i = 0; i < l; i++)      //余多项式系数
	{
		L[i] = A[i];
	}
}

void sign(int m)
{
	if (m == 0)
	{
		return;
	}
	else if (m == 1)
	{
		cout << "x";
	}
	else
	{
		cout << "x^" << m;
	}
}

void coneff_1(int m,int n)
{
	if (m > 0)
	{
		if (m != 1||n==2)
		{
			cout << "+" << m;
		}
		else
		{
			cout << "+";
		}
		return;
	}
	else if (m < 0)
	{
		if (m != -1||n==2)
		{
			cout << "-" << abs(m);
		}
		else
		{
			cout << "-";
		}
		return;
	}
	else
		return;
}

int coneff_2(int m)
{
	return m==0?1:0;
}

void print(double A[], int m)
{
	int i;
	for (i = m - 1; i >= 0; i--)
	{
		if (i == m - 1)
		{
			if (abs(A[i]) == 1)
			{
				cout << ((A[i]) > 0 ? "" : "-");
				sign(i);
			}
			else
			{
				cout << (A[i] > 0 ? "" : "-") << abs(A[i]);
				sign(i);
			}
		}
		else if (i == 0)
		{
			if (coneff_2(A[i]))
			{
				cout << endl;
				return;
			}
			else
			{
				coneff_1(A[i],2);
				cout << endl;
			}
		}
		else
		{
			if(coneff_2(A[i]))
				continue;
			else
			{
				coneff_1(A[i],1);
				sign(i);
			}
		}
	}
}

void input(double A[], int m)
{
	int i;
	int make_sure = 1;
	while(1)
	{ 
		cout << "请依次输入常数项至最高次项的系数,若系数为0,请输入0\n";
		cout << "		e.g: x^2 + 1 ,依次输入 1 0 1\n";
		if(make_sure)
		{ 
			for (i = 0; i < MAX; i++)
			{
				A[i] = 0.0;
			}
			for (i = 0; i < m; i++)
			{
				cin >> A[i];
			}	
			cout << "您输入的多项式为:";
			print(A, m);
			cout << "是否选择重新输入?	0 ———— 否	1 ———— 是\n\n";
			cin >> make_sure;
		}
		if (make_sure == 0)
		{
			break;
		}
	}
}

int main()
{
	double A[MAX] = { 0.0 };
	double B[MAX] = { 0.0 };
	double R[MAX] = { 0.0 };
	double L[MAX] = { 0.0 };
	int choice;//用户的选择操作
	int A_size,B_size;//A,B分别为作运算的两个多项式
	int R_size,L_size;//R用于存储运算结果,L用于存储除法时的余项
	while (1)
	{
		cout << "	  ☆请选择操作☆     \n"
			<< "Ⅰ加法运算       ———— 输入1\n"
			<< "Ⅱ减法运算	 ———— 输入2\n"
			<< "Ⅲ乘法运算	 ———— 输入3\n"
			<< "Ⅳ除法运算	 ———— 输入4\n"
			<< "Ⅴ退出程序	 ———— 输入5\n";
		cout << "请输入:";
		cin >> choice;
		switch (choice)
		{
		case 1:
		{
			cout << "请输入第一个多项式的最高项的次数:";
			cin >> A_size;
			input(A, A_size+1);
			cout << "请输入第二个多项式的最高项的次数:";
			cin >> B_size;
			input(B, B_size + 1);
			R_size = max(A_size + 1, B_size + 1);
			cout << "\n多项式1:";
			print(A, A_size + 1);
			cout << "\n多项式2:";
			print(B, B_size + 1);
			cout << "\n相加后:";
			polynomial_add(A, A_size + 1, B, B_size + 1, R, R_size);
			print(R, R_size);
			system("pause");
			system("cls");
			break;
		}
		case 2:
		{
			cout << "请输入第一个多项式的最高项的次数:";
			cin >> A_size;
			input(A, A_size + 1);
			cout << "请输入第二个多项式的最高项的次数:";
			cin >> B_size;
			input(B, B_size + 1);
			R_size = max(A_size + 1, B_size + 1);
			cout << "\n多项式1:";
			print(A, A_size + 1);
			cout << "\n多项式2:";
			print(B, B_size + 1);
			cout << "\n相减后:";
			polynomial_sub(A, A_size + 1, B, B_size + 1, R, R_size);
			print(R, R_size);
			system("pause");
			system("cls");
			break;
		}
		case 3:
		{
			cout << "请输入第一个多项式的最高项的次数:";
			cin >> A_size;
			input(A, A_size + 1);
			cout << "请输入第二个多项式的最高项的次数:";
			cin >> B_size;
			input(B, B_size + 1);
			R_size = A_size + B_size + 1;
			cout << "\n多项式1:";
			print(A, A_size + 1);
			cout << "\n多项式2:";
			print(B, B_size + 1);
			cout << "\n相乘后:";
			polynomial_mul(A, A_size + 1, B, B_size + 1, R, R_size);
			print(R, R_size);
			system("pause");
			system("cls");
			break;
		}
		case 4:
		{
			cout << "请输入第一个多项式的最高项的次数:";
			cin >> A_size;
			input(A, A_size + 1);
			cout << "请输入第二个多项式的最高项的次数:";
			cin >> B_size;
			input(B, B_size + 1);
			R_size = A_size - B_size + 1;
			L_size = B_size;
			cout << "\n多项式1:";
			print(A, A_size + 1);
			cout << "\n多项式2:";
			print(B, B_size + 1);
			cout << "\n相除后:";
			polynomial_div(A, A_size + 1, B, B_size + 1, R, R_size,L,L_size);
			cout << "商多项式:";
			print(R, R_size);
			cout << "余多项式:";
			print(L, L_size);
			system("pause");
			system("cls");
			break;
		}
		case 5:
		{
			system("cls");
			cout << "再见!";
			return 0;
		}
		default:
			cout << "输入错误,请重新输入\n";
			system("pause");
			system("cls");
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43894577/article/details/86634054
今日推荐