模拟多项式除法
round()是c99以上版本自带,c89没有
#include <bits/stdc++.h>
using namespace std;
unordered_map<int,double> a,b,c;
int e; double ci;
int n,amaxe,bmaxe,bmine,sub,cnt,cmaxe;
double tim;
int main(int argc, char** argv) {
cin>>n;
for(int i=0;i<n;i++){
cin>>e>>ci;
amaxe=max(amaxe,e);
a[e]+=ci;//a记录被除数
}
cin>>n;
bmine=0x3f3f3f3f;
for(int i=0;i<n;i++){
cin>>e>>ci;
bmaxe=max(bmaxe,e);
bmine=min(bmine,e);
b[e]+=ci;
}
//求商,a表余数
for(int i=amaxe;i>=bmaxe;i--){
tim=1.0*a[i]/b[bmaxe];//商的系数
sub=i-bmaxe;//商的指数
c[sub]=tim;
for(int j=i;j>=bmine;j--){
a[j]-=b[j-sub]*tim;//余数
}
}
cnt=0;
cmaxe=amaxe-bmaxe;
for(int i=cmaxe;i>=0;i--){
c[i]=1.0*round(c[i]*10)/10.0;
if(c[i]) cnt++;
}
if(cnt){
cout<<cnt;
for(int i=cmaxe;i>=0;i--){
if(c[i]) printf(" %d %.1lf",i,c[i]);
}
puts("");
}else puts("0 0 0.0");//如果是零多项式,cnt是0要特殊处理
cnt=0;
for(int i=amaxe;i>=0;i--){
a[i]=1.0*round(a[i]*10)/10.0;
if(a[i]) cnt++;
}
if(cnt){
cout<<cnt;
for(int i=amaxe;i>=0;i--){
if(a[i]) printf(" %d %.1lf",i,a[i]);
}
puts("");
}else puts("0 0 0.0");
return 0;
} 
京公网安备 11010502036488号