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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM