以前只写过加减乘,通过这道题学习了下多项式除法,过程中遇到了不少坑,想了一个多小时,总结一下。(菜死了..
原题链接: L2-018 多项式A除以B
思路:
1.数组模拟多项式 d[i] i表示指数 d[i]表示系数
2.循环终止条件就是当a的最大指数小于b的最大指数时,这时a就是余数。否则就一直循环。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
double a[N],b[N],c[N];
int get_nums(double d[],int s){//看四舍五入且保留一位小数之后还有多少个非0项
int cnt=0;
for(int i=s;i>=0;i--){
if(fabs(d[i])+0.05>=0.1)cnt++;
}
return cnt;
}
void print(double d[],int s){
cout<<get_nums(d,s);
if(!get_nums(d,s)){
cout<<" 0 0.0"<<endl;
return;
}
for(int i=N;i>=0;i--){
if(fabs(d[i])+0.05>=0.1){
printf(" %d %.1lf",i,d[i]);
}
}
cout<<endl;
}
int main(){
int m;
cin>>m;
int maxn1=-1;
for(int i=0;i<m;i++){
int x;
cin>>x;
maxn1=max(maxn1,x);
cin>>a[x];//指数为x的系数为a[x]
}
int n;
cin>>n;
int maxn2=-1;
for(int i=0;i<n;i++){
int x;
cin>>x;
maxn2=max(maxn2,x);
cin>>b[x];
}
int t1=maxn1,t2=maxn2;
while(t1>=t2){
double temp=a[t1]/b[t2];
c[t1-t2]=temp;
for(int i=t1,j=t2;j>=0;i--,j--){
a[i]-=b[j]*temp;
//cout<<a[i]<<endl;;
}
while(fabs(a[t1])<1e-6){
t1--;
}
}
print(c,maxn1-maxn2);//商 商的最高次幂是maxn1-maxn2
print(a,t1);//余数
return 0;
}