7-10 多项式A除以B (25 分)

题目链接:https://pintia.cn/problem-sets/1108548596745592832/problems/1108548661014913033

题目大意:

这仍然是一道关于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,故不输出。

具体思路:模拟多项式除法,注意精度控制。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 # define ll long long
 4 # define inf 0x3f3f3f3f
 5 const int maxn = 1e5+100;
 6 double a[maxn],b[maxn],c[maxn];
 7 int main()
 8 {
 9     int n,m,tmp,maxa,maxb;
10     scanf("%d",&n);
11     for(int i=0; i<n; i++)
12     {
13         scanf("%d",&tmp);
14         scanf("%lf",&a[tmp]);
15         if(i==0)
16             maxa=tmp;
17     }
18     scanf("%d",&m);
19     for(int i=0; i<m; i++)
20     {
21         scanf("%d",&tmp);
22         scanf("%lf",&b[tmp]);
23         if(i==0)
24             maxb=tmp;
25     }
26    int j;
27     for(int i=maxa; i>=maxb; i--)
28     {
29         c[i-maxb]=a[i]/b[maxb];
30         for( j=maxb; j>=0; j--)
31         {
32             a[i+j-maxb]-=b[j]*c[i-maxb];
33         }
34     }
35     int num1=0,num2=0;
36     for(int i=maxa-maxb; i>=0; i--)
37     {
38         if(fabs(c[i])>1e-6)
39         {
40             if(fabs(c[i])<0.05)
41                 c[i]=0;
42             else
43                 num1++;
44         }
45     }
46     if(num1==0)
47     {
48         printf("0 0 0.0\n");
49     }
50     else
51     {
52         printf("%d",num1);
53         for(int  i=maxa-maxb; i>=0; i--)
54         {
55            if(fabs(c[i])>1e-6)
56         printf(" %d %.1lf",i,c[i]);
57         }
58         printf("\n");
59     }
60     for(int i=maxb-1; i>=0; i--)
61     {
62         if(fabs(a[i])>1e-6)
63         {
64          //   cout<<a[i]<<endl;
65             if(fabs(a[i])<0.05)
66                 a[i]=0;
67             else
68                 num2++;
69         }
70     }
71     if(num2==0)
72     {
73         printf("0 0 0.0\n");
74     }
75     else
76     {
77         printf("%d",num2);
78         for(int i=maxb-1; i>=0; i--)
79         {
80             if(fabs(a[i])>1e-6)
81                 printf(" %d %.1lf",i,a[i]);
82         }
83         printf("\n");
84     }
85 }

 

posted @ 2019-03-22 17:18  Let_Life_Stop  阅读(1555)  评论(1编辑  收藏  举报