1 #include <iostream> 2 #include <map> 3 #include <cmath> 4 #include <cstdio> 5 using namespace std;//系数要求保留一位小数,所以绝对值小于0.05都当成0对待 6 struct poly 7 { 8 int e; 9 double c; 10 }p[10000],ans[10000]; 11 int main() 12 { 13 int n = 0,e = 0,c = 0,m = -1,ant = 0;//m记录a中最高次 e是指数 c是系数 输入都是整数 14 map<int,double> q; 15 cin>>n; 16 for(int i = 0;i < n;i ++) 17 { 18 cin>>e>>c; 19 q[e] = c; 20 if(i == 0)m = e; 21 } 22 cin>>n; 23 for(int i = 0;i < n;i ++) 24 { 25 cin>>p[i].e>>p[i].c; 26 } 27 while(m >= p[0].e) 28 { 29 double change = q[m]/p[0].c;//分析中所述的 a中最高次除以b中最高次 系数比 30 int diff = m - p[0].e;//指数比 31 if(fabs(change) >= 0.05) 32 { 33 ans[ant].e = diff; 34 ans[ant ++].c = change; 35 for(int i = 0;i < n;i ++)//change 乘以 b 更新a中的变化 36 { 37 q[p[i].e + diff] -= change * p[i].c; 38 } 39 } 40 else m --;//一定别忘了m-- 不然会超时,太过于马虎 if else语句还是想清楚 写完备一些好光有if没else就容易错误啊。。 41 while(m >= p[0].e && fabs(q[m]) < 0.05) 42 { 43 m --; 44 } 45 } 46 cout<<ant; 47 if(!ant)cout<<" 0 0.0"; 48 for(int i = 0;i < ant;i ++) 49 printf(" %d %.1f",ans[i].e,ans[i].c); 50 cout<<endl; 51 ant = 0; 52 while(m >= 0) 53 { 54 if(fabs(q[m]) >= 0.05) 55 { 56 ans[ant].e = m; 57 ans[ant ++].c = q[m]; 58 } 59 m --; 60 } 61 cout<<ant; 62 if(!ant)cout<<" 0 0.0"; 63 for(int i = 0;i < ant;i ++) 64 printf(" %d %.1f",ans[i].e,ans[i].c); 65 }