这仍然是一道关于A/B的题,只不过A和B都换成了多项式。你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数。
输入格式:
输入分两行,每行给出一个非零多项式,先给出A,再给出B。每行的格式如下:
N e[1] c[1] ... e[N] c[N]
其中N
是该多项式非零项的个数,e[i]
是第i
个非零项的指数,c[i]
是第i
个非零项的系数。各项按照指数递减的顺序给出,保证所有指数是各不相同的非负整数,所有系数是非零整数,所有整数在整型范围内。
输出格式:
分两行先后输出商和余,输出格式与输入格式相同,输出的系数保留小数点后1位。同行数字间以1个空格分隔,行首尾不得有多余空格。注意:零多项式是一个特殊多项式,对应输出为0 0 0.0
。但非零多项式不能输出零系数(包括舍入后为0.0)的项。在样例中,余多项式其实有常数项-1/27
,但因其舍入后为0.0,故不输出。
输入样例:
4 4 1 2 -3 1 -1 0 -1
3 2 3 1 -2 0 1
输出样例:
3 2 0.3 1 0.2 0 -1.0
1 1 -3.1
题意:
给定两个多项式,计算两个多项式相处的商和余数
思路:
用三个double数组分别存三个多项式,数组下标为多项式的指数,数组的值为对应指数的系数,实际上这样存储相当于将离散化数据连续化,即把系数为零的项数也补全了。如 数组表示为[-1,2,-3,0,1](注意:题目没有说指数的范围,只保证了所有指数是各不相同的非负整数,实测数组开到3010不会发生段错误)
随后就是对多项式除法的模拟了,在此之前需要计算两个多项式的最高幂对应的系数,其中被除多项式需要在每次计算之后更新,最后特判零多项式,仅在多项式项数为零时输出
代码:
//7-10 多项式A除以B (25 分)
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1010;
int m , n , t1 , t2 , e , c;
double c1[N] , c2[N] , c3[N]; //下标为指数,值为系数
int calCnt(double c[] , int start) //计算多项式非零系数个数
{
int cnt = 0;
for(int i = start ; i >= 0 ; i--)
if(abs(c[i]) + 0.05 >= 0.1) //手动保留一位小数
cnt++;
return cnt;
}
void print(double c[] , int start)
{
int cnt = calCnt(c , start);
cout<<cnt;
if(cnt == 0) //特判零多项式,当且仅当一项都没有才输出
cout<<" 0 0.0";
for(int i = start ; i >= 0 ; i--)
if(abs(c[i]) + 0.05 >= 0.1)
printf(" %d %.1lf" , i , c[i]);
cout<<endl;
}
int main()
{
cin>>m;
for(int i = 0 ; i < m ; i++)
{
cin>>e>>c;
if(!i) t1 = e; //取出被除数多项式最高幂系数
c1[e] = c;
}
cin>>n;
for(int i = 0 ; i < n ; i++)
{
cin>>e>>c;
if(!i) t2 = e; //取出除数多项式最高幂系数
c2[e] = c;
}
int max1 = t1; //暂存除数多项式最高幂系数
while(t1 >= t2)
{
double c = c1[t1] / c2[t2]; //依次计算最高系数相除
c3[t1 - t2] = c; //存入结果数组
for(int i = t1 , j = t2 ; j >= 0 ; i-- , j--)
c1[i] -= c2[j] * c; //被除数变小
while(abs(c1[t1]) < 1e-8) //被除数最高幂系数更新
t1--;
}
print(c3 , max1 - t2); //输出商和余数(传入最高幂系数)
print(c1 , t1);
return 0;
}