1. 程式人生 > >L2-018. 多項式A除以B

L2-018. 多項式A除以B

必須 進行 cin ios pan 小數 color amp 行數

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


最初看到這道題就頭疼,做加法乘法的時候就很煩心,現在又來個除法,折磨人啊,想了想數學上也做過這種題,拼湊嘛,我記得當時還是對於分子分母都是多項式的進行化簡的一個方法。。說道拼湊就是a/b,只要a找那個存在比b中最高次的指數大,那麽就可以拼湊,拿樣例來說,a = x^4 - 3x^2 - x - 1,b = 3x^2 - 2x + 1。對於a的第一項指數4比b最高次指數2大,那麽商的第一項就是x^4/3x^2 = 0.3x^2,然後用0.3x^2去乘以b的每一項,在a中更新,也就是a要減去b*0.3x^2,更新完以後,a要繼續重復以上過程,知道a中最高次比b中最高次低,剩下的就算是余數了,這裏用了個map記錄a,方便進行更新,b自始至終是不變的。

代碼:
#include <iostream>
#include <map>
#include <cmath>
#include <cstdio>
using namespace std;//系數要求保留一位小數,所以絕對值小於0.05都當成0對待
struct poly
{
    int e;
    double c;
}p[10000],ans[10000];
int main()
{
    int n = 0,e = 0,c = 0,m = -1,ant = 0;//m記錄a中最高次 e是指數 c是系數 輸入都是整數
    map<int
,double> q; cin>>n; for(int i = 0;i < n;i ++) { cin>>e>>c; q[e] = c; if(i == 0)m = e; } cin>>n; for(int i = 0;i < n;i ++) { cin>>p[i].e>>p[i].c; } while(m >= p[0].e) { double change = q[m]/p[0].c;//分析中所述的 a中最高次除以b中最高次 系數比 int diff = m - p[0].e;//指數比 if(fabs(change) >= 0.05) { ans[ant].e = diff; ans[ant ++].c = change; for(int i = 0;i < n;i ++)//change 乘以 b 更新a中的變化 { q[p[i].e + diff] -= change * p[i].c; } } else m --;//一定別忘了m-- 不然會超時,太過於馬虎 if else語句還是想清楚 寫完備一些好光有if沒else就容易錯誤啊。。 while(m >= p[0].e && fabs(q[m]) < 0.05) { m --; } } cout<<ant; if(!ant)cout<<" 0 0.0"; for(int i = 0;i < ant;i ++) printf(" %d %.1f",ans[i].e,ans[i].c); cout<<endl; ant = 0; while(m >= 0) { if(fabs(q[m]) >= 0.05) { ans[ant].e = m; ans[ant ++].c = q[m]; } m --; } cout<<ant; if(!ant)cout<<" 0 0.0"; for(int i = 0;i < ant;i ++) printf(" %d %.1f",ans[i].e,ans[i].c); }

L2-018. 多項式A除以B