L2-018. 多项式A除以B

L2-018. 多项式A除以B

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

这仍然是一道关于A/B的题,只不过A和B都换成了多项式。你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数。

输入格式:

输入分两行,每行给出一个非零多项式,先给出A,再给出B。每行的格式如下:

N e[1] c[1] ... e[N] c[N]

其中N是该多项式非零项的个数,e[i]是第i个非零项的指数,c[i] 是第i个非零项的系数。各项按照指数递减的顺序给出,保证所有指数是各不相同的非负整数,所有系数是非零整数,所有整数在整型范围内。

输出格式:

分两行先后输出商和余,输出格式与输入格式相同,输出的系数保留小数点后1位。同行数字间以1个空格分隔,行首尾不得有多余空格。注意:零多项式是一个特殊多项式,对应输出为“0 0 0.0”。但非零多项式不能输出零系数(包括舍入后为0.0)的项。在样例中,余多项式其实有常数项“-1/27”,但因其舍入后为0.0,故不输出。

输入样例:
4 4 1 2 -3 1 -1 0 -1
3 2 3 1 -2 0 1
输出样例:
3 2 0.3 1 0.2 0 -1.0
1 1 -3.1

 题解:这个题目,我在考场上又没做出来。。。这么一想,不知道自己在考场上干嘛?划水划了几个小时?

回来做这个题目又涨知识了。。。原来多项式是这么回事啊!

这个题目有个小细节啊。。double类型的数据,不要直接写成 != 0  (!!!) 精度问题!!!, 写成 >1e-8 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 //#define loc
 4 const int maxn=1e6+5;
 5 double a[maxn], b[maxn], ans[maxn];
 6 
 7 int main(){
 8     #ifdef loc
 9         freopen("data.in", "r", stdin);
10     #endif
11     memset(a, 0, sizeof(a));
12     memset(b, 0, sizeof(b));
13     memset(ans, 0, sizeof(ans));
14     int n, m;
15     cin>>n;
16     int max_a=-1, max_b=-1, c, d, m_a, m_b;
17     for(int i=0; i<n; i++){
18         cin>>c>>d;
19         a[c]=d;
20         max_a=max(max_a, c);
21     }
22     m_a=max_a;
23     cin>>m;
24     for(int i=0; i<m; i++){
25         cin>>c>>d;
26         b[c]=d;
27         max_b=max(max_b, c);
28     }
29     m_b=max_b;
30     //cout<<max_a <<" "<<max_b<<endl;
31     /*
32     for(int i=n; i>=0; i--) cout<<i<<" "<<a[i]<<" ";
33     cout<<endl;
34     for(int i=m; i>=0; i--) cout<<i<<" "<<b[i]<<" ";
35     cout<<endl;
36     */
37     int cnt_1=0, cnt_2=0;
38     while(max_a>=max_b){
39         double x=a[max_a]/b[max_b];
40         ans[max_a-max_b]=x;
41         if(fabs(x)>=0.05)    cnt_1++;       //浮点数的绝对值函数用fabs();整型用abs();
42         for(int j=0; j<=max_b; j++){
43             a[j+max_a-max_b]-=b[j]*x;
44         }
45         int j;
46         for(j=max_a; j>=0; j--){
47             if(fabs(a[j])>=0.05){
48                 max_a=j;
49                 break;
50             }
51         }
52         if(j<0)    break;
53     }
54     if(cnt_1==0){
55         cout<<"0 0 0.0";
56     }
57     else{
58         cout<<cnt_1;
59         for(int i=m_a; i>=0; i--){
60             if(fabs(ans[i])>=0.05){
61                 printf(" %d %.1f", i, ans[i]);
62             }
63         }        
64     }
65     cout<<endl;
66     for(int i=m_a; i>=0; i--){
67         if(fabs(a[i])>=0.05) cnt_2++;
68     }
69     if(cnt_2==0){
70         cout<<"0 0 0.0";
71     }
72     else{
73         cout<<cnt_2;
74         for(int i=m_a; i>=0; i--){
75             if(fabs(a[i])>=0.05){
76                 printf(" %d %.1f", i, a[i]);
77             }
78         }        
79     }
80     cout<<endl;
81     return 0;
82 }
原文地址:https://www.cnblogs.com/ledoc/p/6651270.html