02-線性結(jié)構(gòu)2 一元多項(xiàng)式的乘法與加法運(yùn)算

題目簡(jiǎn)述

設(shè)計(jì)函數(shù)分別求兩個(gè)一元多項(xiàng)式的乘積與和。

輸入格式:

輸入分2行,每行分別先給出多項(xiàng)式非零項(xiàng)的個(gè)數(shù),再以指數(shù)遞降方式輸入一個(gè)多項(xiàng)式非零項(xiàng)系數(shù)和指數(shù)(絕對(duì)值均為不超過1000的整數(shù))。數(shù)字間以空格分隔。

輸出格式:

輸出分2行,分別以指數(shù)遞降方式輸出乘積多項(xiàng)式以及和多項(xiàng)式非零項(xiàng)的系數(shù)和指數(shù)。數(shù)字間以空格分隔,但結(jié)尾不能有多余空格。零多項(xiàng)式應(yīng)輸出0 0。

輸入樣例:

4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1

輸出樣例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

基本思路

以數(shù)組結(jié)構(gòu)的方式構(gòu)造多項(xiàng)式,并設(shè)計(jì)以下函數(shù):

  • 兩個(gè)多項(xiàng)式相加:逐項(xiàng)比對(duì),指數(shù)較大者放置項(xiàng);指數(shù)相等時(shí)系數(shù)相加;一個(gè)多項(xiàng)式所有項(xiàng)放置完后直接放置另一個(gè)多項(xiàng)式的剩余項(xiàng);
  • 多項(xiàng)式乘單項(xiàng)式:每一項(xiàng)指數(shù)相加,系數(shù)相乘即可;
  • 多項(xiàng)式乘多項(xiàng)式:逐項(xiàng)進(jìn)行多項(xiàng)式乘單項(xiàng)式;
  • 特殊情形:存在零多項(xiàng)式時(shí),乘積結(jié)果為0;

代碼

#include <iostream>
using namespace std;

/**
 多項(xiàng)式每一項(xiàng)的數(shù)據(jù)結(jié)構(gòu)
 */
typedef struct{
    int coef;
    int expo;
} poly;

/**
讀取多項(xiàng)式

 @param length 多項(xiàng)式長(zhǎng)度
 @param p 多項(xiàng)式數(shù)組地址
 @return 多項(xiàng)式數(shù)組地址
 */
poly* ScanfPoly(int length,poly *p){
    for (int i=0; i<length; i++) {
        cin>>p[i].coef>>p[i].expo;
    }
    return p;
}

/**
 輸出多項(xiàng)式

 @param length 要輸出的多項(xiàng)式長(zhǎng)度
 @param p 要輸出的多項(xiàng)式數(shù)組地址
 */
void PrintPoly(int length,poly *p){
    bool flag=false;
    /*輸出第一項(xiàng)*/
    if(p->coef!=0){//只輸出非零項(xiàng)
        printf("%d %d",p->coef,p->expo);
        flag=true;
    }
    /*依次輸出后面的每一項(xiàng)*/
    poly *pol=p+1;
    while (pol<(p+length)) {
        if(pol->coef!=0) {
            printf(" %d %d",pol->coef,pol->expo);
            flag=true;
        }
        pol++;
    }
    /*如果沒輸出過任何項(xiàng),輸出0 0*/
    if(flag==false)printf("0 0");
}

/**
 多項(xiàng)式的加法運(yùn)算

 @param p1 多項(xiàng)式1
 @param l1 多項(xiàng)式1的項(xiàng)數(shù)
 @param p2 多項(xiàng)式2
 @param l2 多項(xiàng)式2的項(xiàng)數(shù)
 @param is 接收和多項(xiàng)式項(xiàng)數(shù)的值
 @return 和多項(xiàng)式的地址
 */
poly* PlusPoly(poly *p1,int l1,poly *p2,int l2,int &is){
    poly *sum=(poly*)malloc((l1+l2)*sizeof(poly));

    int i1,i2;
    for (i1=0,i2=0,is=0; i1<l1 || i2<l2; is++) {
        if(i2>=l2 || p1[i1].expo>p2[i2].expo){
            sum[is]=p1[i1];
            i1++;
        }
        else if(i1>=l1 || p1[i1].expo<p2[i2].expo){
            sum[is]=p2[i2];
            i2++;
        }
        else if(p1[i1].expo==p2[i2].expo){
            sum[is].expo=p1[i1].expo;
            sum[is].coef=p1[i1].coef+p2[i2].coef;
            i1++;
            i2++;
        }
    }
    return sum;
}

bool polyComplare(poly p1,poly p2){
    return (p1.expo>p2.expo);
}

/**
 單項(xiàng)式乘多項(xiàng)式

 @param p1 單項(xiàng)式
 @param p2 多項(xiàng)式
 @param l2 多項(xiàng)式的項(xiàng)數(shù)
 @return 多項(xiàng)式的地址
 */
poly* multiOnePoly(poly p1,poly *p2,int l2){
    poly *proPoly=(poly*)malloc(l2*sizeof(poly));
    for (int i=0; i<l2; i++) {
        proPoly[i].coef = p2[i].coef*p1.coef;
        proPoly[i].expo = p2[i].expo+p1.expo;
    }
    return proPoly;
}

/**
 多項(xiàng)式乘多項(xiàng)式(??!不能有零多項(xiàng)式)

 @param p1 多項(xiàng)式1
 @param l1 多項(xiàng)式1的長(zhǎng)度
 @param p2 多項(xiàng)式2
 @param l2 多項(xiàng)式2的長(zhǎng)度
 @param lpro 要接收的積多項(xiàng)式的長(zhǎng)度
 @return 積多項(xiàng)式
 */
poly* MultiplyPoly(poly *p1,int l1,poly *p2,int l2,int &lpro){
    poly *AllProductPoly;
    lpro=0;
    int lengthPro=0;
    for (int i=0; i<l1; i++) {
        poly* SingleProductPoly;
        SingleProductPoly=multiOnePoly(p1[i], p2, l2);//求出p2與p1的每一項(xiàng)相乘的積多項(xiàng)式
        
        /*總積多項(xiàng)式必須放后面*/
        AllProductPoly=PlusPoly(SingleProductPoly, l2, AllProductPoly, lpro, lengthPro);
        free(SingleProductPoly);//手動(dòng)釋放內(nèi)存空間,后同
        
        lpro=lengthPro;
    }
    return AllProductPoly;
}

int main(int argc, const char * argv[]) {
    /*讀取多項(xiàng)式1和多項(xiàng)式2*/
    int K1,K2;
    cin>>K1;
    poly *p1=(poly*)malloc(K1*sizeof(poly));
    ScanfPoly(K1,p1);

    cin>>K2;
    poly *p2=(poly*)malloc(K2*sizeof(poly));
    ScanfPoly(K2,p2);
    
    
    /*求積*/
    if(K1!=0 && K2!=0){
        poly *productPoly;
        int lpro=0;
        productPoly=MultiplyPoly(p1, K1, p2, K2, lpro);
        PrintPoly(lpro, productPoly);
        free(productPoly);
        cout<<'\n';
    }else printf("0 0\n");
    
    /*求和*/
    poly *sumPoly;
    int lsum;
    sumPoly=PlusPoly(p1, K1, p2, K2, lsum);
    PrintPoly(lsum, sumPoly);
    free(sumPoly);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容