模拟多项式除法
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; }