1. 程式人生 > >gplt 團體程式設計天梯賽 多項式A除以B(模擬)

gplt 團體程式設計天梯賽 多項式A除以B(模擬)

5-10 多項式A除以B   (25分)

這仍然是一道關於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

解題思路:

這道題賽時沒仔細看,看著大家都跳了,我也跟著跳了,結果最後一小時一分也沒出2333

重現後仔細一看,想起了初中自己yy出來的多項式除法,當時好像是為了因式分解所以想出這個東西的。然後表示很吐血,賽時做一下怎麼也能拿分吧。

具體做法模擬多項式除法去做就好了,如果不知道多項式除法的可以去看百科,或者看我的程式。

然後坑點就在判0了,我一開始被示例 誤導以為0項都在最後面,所以我判0直接從最後開始,然後果斷丟了10分,改下就過了。

程式碼:

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
struct node
{
    double a;
    int mi;
}x[maxn], y[maxn], q[maxn], r[maxn], dif[maxn];
int n, m, z;
void mod()
{
     int o, p,  e=0, i, j, k=0, m1, m2;
     i=j=0;
     m1=x[0].mi;
     m2=y[0].mi;
//     cout<<m1<<" "<<m2<<endl;
     while(m1>m2 ||(m1==m2 && fabs(x[0].a-0)>=0.1))
     {
//         printf("m1 %d m2 %d\n", m1, m2);
        q[k].mi=m1-m2;
        q[k].a=r[0].a/y[0].a;//得到商 
        i=0;
        for(e=1; e<m; e++) //減數多項式
        {
            dif[e].mi=q[k].mi+y[e].mi; //mi相加
            dif[e].a=q[k].a*y[e].a;
//            printf("%.2lf %.2lf %.2lf %d %d %d\n", dif[e].a, q[k].a, y[e].a,  dif[e].mi, q[k].mi, y[e].mi);
        }
        o=1;
        p=1;
        i=0;
        while(p<n && o<m)
        {
            
            if(r[p].mi>dif[o].mi) //被除數mi大
            {
                x[i]=r[p];
                p++;
            }
            else if(r[p].mi==dif[o].mi)//mi相等則相減
            {
                x[i].mi=r[p].mi;
                x[i].a=r[p].a-dif[o].a;
                p++,o++;
            }
            else //除數mi大
            {
                x[i]=dif[o];
                x[i].a=-dif[o].a;
                o++;
            }
            i++;
        }
     if(p<n)
     {
        for(; p<n; p++)x[i++]=r[p];
     }
     else
     {
        for(; o<m; o++)
        {
            x[i].a=-dif[o].a;
            x[i].mi=dif[o].mi;
            i++;
        }
     }
        if(i==0)
        {
            x[i].a=0.0;
            x[i].mi=0;
            i++;
        }
        n=i;
        
        for(i=0; i<n; i++)
        {
            r[i]=x[i];
//            printf("%.1lf %d\n", x[i].a, x[i].mi);
        }
        m1=x[0].mi; 
        k++;
     }
     z=k;
     return;
}
int main()
{
    cin>>n;
    int i, j=0;
    for(i=0; i<n; i++)
    {
        scanf("%d%lf", &x[j].mi, &x[j].a);
        /*
        while(j>0 && x[j-1].mi>x[j].mi+1)
        {
            x[j+1]=x[j];
            x[j].mi=x[j-1].mi-1;
            x[j].a=0.0;
            j++;
        }
        */
        r[j].a=x[j].a; 
        r[j].mi=x[j].mi;
        j++;
    }
    cin>>m;
    for(i=0; i<m; i++)
    {
        scanf("%d%lf", &y[i].mi, &y[i].a);
    }
    mod();   
    int count=z;
    for(i=0; i<z; i++)if(fabs(q[i].a)<0.1)count--;
    cout<<count;
    for(i=0; i<z; i++)if(!(fabs(q[i].a)<0.1))printf(" %d %.1lf", q[i].mi, q[i].a);    
    if(count==0)printf(" 0 0.0\n");
    else printf("\n");
    count=n;
    for(i=0; i<n; i++)if(fabs(r[i].a)<0.1)count--;
    
    printf("%d", count);
    if(count==0)printf(" 0 0.0\n");
    for(i=0; i<n; i++)if(!(fabs(r[i].a)<0.1))printf(" %d %.1lf", r[i].mi, r[i].a);

}
/*
2 1 2 0 1
1 0 2
*/