就很朴素的做法,把网上如何实现多项式除法按照步骤写出来就行了。
做法:
http://www.360doc.com/content/22/1024/07/16439044_1053039523.shtml
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int const N=1e5+10;
int n,m;
double a[N],b[N],c[N];//下标就是阶数
int main(){
int ea=0,eb=0;
cin>>n;
for(int i=0;i<n;i++){
int e,c;
cin>>e>>c;
a[e]=c;
ea=max(ea,e);
}
cin>>m;
for(int i=0;i<m;i++){
int e,c;
cin>>e>>c;
b[e]=c;
eb=max(eb,e);
}
//多项式除法的朴素做法
//x^4-3x^3-x-1
//3x^3-2x+1
//1、每次被除数的最高位与除数的最高位比较,看看差了多少
//2、计算得到倍数 记录倍数到另外一个数组中
//3、将倍数乘以除数,加入到除数中。
//4、当除数的阶最大阶大于被除数时,停止。余数就是被除数
int maxc=0,y=0;
int nc=0,ny=0;
for(int i=ea;i>=0;i--){
if(i<eb){
y=i;
break;
}
int ce;
double cc;
ce=i-(eb);//阶数差距
cc=a[i]/b[eb];
maxc=max(ce,maxc);
if(cc==0) continue;
for(int j=eb;j>=0;j--){//ce是商的阶数,cc是商最高阶的的系数
a[ce+j]-=cc*b[j];//输入到原阶数中
}
c[ce]=cc;
}
//检索商的非0
for(int i=maxc;i>=0;i--){
if((int)(c[i]*10)==0){
c[i]=0;
}
if(c[i]!=0)
nc++;
}
cout<<nc<<" ";
if(nc==0)cout<<0<<" "<<"0.0";
else{
vector<double> v;
for(int i=maxc;i>=0;i--){
if(c[i]!=0) {
v.push_back(i);
v.push_back(c[i]);
}
}
for(int i=0;i<v.size();i+=2)
if(i!=v.size()-2)
printf("%d %.1f ",(int)v[i],v[i+1]);
else printf("%d %.1f",(int)v[i],v[i+1]);
}
puts("");
//检索余数的非0
for(int i=ea;i>=0;i--){
if((int)(a[i]*10)==0){
a[i]=0;
}
if(a[i]!=0)
ny++;
}
cout<<ny<<" ";
if(ny==0)cout<<0<<" "<<"0.0";
else{
vector<double> v;
for(int i=ea;i>=0;i--){
if(a[i]!=0) {
v.push_back(i);
v.push_back(a[i]);
}
}
for(int i=0;i<v.size();i+=2)
if(i!=v.size()-2)
printf("%d %.1f ",(int)v[i],v[i+1]);
else printf("%d %.1f",(int)v[i],v[i+1]);
}
puts("");
}