L2-018. 多项式A除以B

参考博客

 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 }