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 }