一、前言
这篇文章用来集合之前写的多项式的加减乘除、多项式格式化输出器和一个用来控制它们的主程序。(主程序的源代码在后文,源代码主体部分还是在以下链接中)
二、效果
用户在输入每一个多项式之前需要提供最高项的次数,之后按规则依次输入系数,输入完成后,系统会生成一个多项式,供用户确认,若错误,可以选择重新输入。另外,用户可重复运算。
效果图如下
- 加法运算
- 减法运算
- 乘法运算
- 除法运算
三、源代码
#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");
}
}
}