【分析】
一元多项式除法可以仿照数字的竖式除法,用减法来实现带余项的除法。其演算过程如 下:
(1)把被除式、除式按变量作降幂排列,并把所缺的项用零补齐;
(2)用被除式的第一项除以除式第一项,得到商式的第一项;
(3)用商式的第一项去乘除式,把积写在被除式下面(同类项对齐),消去相等项, 把不相等的项结合起来;
(4)把减得的差当作新的被除式,再按照上面的方法继续演算,直到余式为零或余式 的次数低于除式的次数时为止。
实现思路:
(1)设 P(X)为被除式、Q(x)为除式、R(x)为商式,若 P(X)最高次项为 m 次,Q(x) 最高次项为 n 次,则 R(x) 最高次项为 m-n 次;
(2)若用数组 a、 b、 c 存储 P(X)、Q(x)、 R(x),则第一次运算用 a[m]/b[n],并将结果放到 c[m-n]中,然后从数组 a 最高次开始依次减去 c[m-n]乘以数组 b;
(3)第二次运算用新的数组 a 和数组 b 继续上面的运算过程(此时 m 变为 m-1);
(4)重复执行第(2)和(3)步,直到数组 a 全为 0 或者数组 a 中的最高次项(即不为 0 的最大下标)小于数组 b 中的最高次项。
我写的是这样的:
#include"stdio.h"
#include"stdlib.h"
#include<math.h>
void input(int y[], int m)/*多项式系数输入函数*/
{
int i;
for (i = 0; i < m; i++)
scanf("%d", &y[i]);
}
void output(int a[], int x)/*多项式输出函数*/
{
int i, sum = 0;
for (i = 0; i < x; i++)
{
if (a[i] == 0)
continue;
if (i == 0)
printf("%d", a[i]);
else if (i == 1)
{
if (a[i] == 1)
printf("+X");
else if (a[i] == -1)
printf("-X");
else if (a[i] > 0)
printf("+%dX", a[i]);
else if (a[i] < 0)
printf("%dX", a[i]);
}
else
{
if (a[i] == 1)
printf("+X^%d", i);
else if (a[i] == -1)
printf("-X^%d", i);
else if (a[i] > 0)
printf("+%dX^%d", a[i], i);
else if (a[i] < 0)
printf("%dX^%d", a[i], i);
}
}
}
void division(int a[], int m, int b[], int n, int c[])
{
int i, j = m;
int d[100] = { 0 };/*用来存放商乘除数的中间多项式*/
for (int r = 0; r <=m - n; r++)
c[r] = 0;
while ( m >= n)
{
c[m - n] = a[m] / b[n];
for (i = n; i >=0; i--)
{
d[j] = c[m - n] * b[i];
j--;
}
for (int k = m; k >= 0; k--)
{
a[k] = a[k] - d[k];
}
m--;
}
}
int main()
{
int P[100] = { 0 }, Q[100] = { 0 }, R[100] = { 0 };
int m, n;
printf("请输入一元多项式的项数m(0<m<=100):");
scanf("%d", &m);
printf("请输入一元多项式的系数(按指数由小到大排列输入):");
input(P, m);
printf("您输入的多项式为P(X)=");
output(P, m);
printf("\n\n请输入一元多项式Q(X)的项数n(0<n<=100):");
scanf("%d", &n);
printf("请输入Q(X)的系数(按指数由小到大排列输入):");
input(Q, n);
printf("您输入的多项式Q(X)=");
output(Q, n);
printf("\n\n两个多项式相除结果F(X)=P(X)/Q(X)=");
division(P, m, Q, n, R);
output(R, m - n);
return 0;
}
例子的运行结果是这样:
所以为什么没有结果呢?