数据结构-多项式

#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;
const int MAX_TERMS = 1000;

typedef struct
{
    float coaf;
    int expon;
}polynomial;
polynomial terms[MAX_TERMS];
int avail = 0;

void init(int *starta, int *finisha, int *startb, int *finishb)
{
    int n;
    scanf("%d", &n); //poly a's input
    for(int i = 0; i < n; i++){
        scanf("%f %d", &terms[i].coaf, &terms[i].expon);
    }
    *finisha = n-1;
    *startb = n;
    scanf("%d", &n); //poly b's input
    for(int i = 0; i < n; i++){
        scanf("%f %d", &terms[*startb+i].coaf, &terms[*startb+i].expon);
    }
    *finishb = *startb+n-1;
    avail = *finishb+1;
}

bool CMP(polynomial a, polynomial b)
{
    return a.expon < b.expon;
}

int cmp(int a, int b)
{
    if(a < b) return -1;
    if(a > b) return 1;
    return 0;
}

void attach(float cofficient, int expon)
{
    if(avail == MAX_TERMS){
        printf("Too many terms in the polynomial\n");
        exit(1);
    }
    terms[avail].coaf = cofficient;
    terms[avail++].expon = expon;
}


void padd(int starta, int finisha, int startb, int finishb, int *startd, int *finishd)
{
    float cofficient;
    *startd = avail;
    while(starta <= finisha && startb <= finishb)
    {
        switch(cmp(terms[starta].expon, terms[startb].expon))
        {
        case -1: //a.expon < b.expon
            attach(terms[startb].coaf, terms[startb].expon);
            startb++;
            break;
        case 0: //a.expon = b.expon
            cofficient = terms[startb].coaf+terms[starta].coaf;
            attach(cofficient, terms[startb].expon);
            starta++; startb++;
            break;
        case 1: //a.expon > b.expon
            attach(terms[starta].coaf, terms[starta].expon);
            starta++;
            break;
        }
    }
    for( ;starta <= finisha; starta++){
        attach(terms[starta].coaf, terms[starta].expon);
    }
    for( ;startb <= finishb; startb++){
        attach(terms[startb].coaf, terms[startb].expon);
    }
    *finishd = avail-1;
}

void Solve(int *startd, int *finishd, float cofficient, int expon)
{
    for(int i = *startd; i <= *finishd; i++){
        if(terms[i].expon == expon){
            terms[i].coaf = terms[i].coaf+cofficient;
            return;
        }
    }
    if(avail == MAX_TERMS){
        printf("Too many terms in the polynomial");
        exit(1);
    }
    terms[avail].coaf = cofficient;
    terms[avail++].expon = expon;
    *finishd = avail-1;
}

void Mult(int starta, int finisha, int startb, int finishb, int *startd, int *finishd)
{
    float cofficient;
    int expon;
    *startd = avail;
    *finishd = *startd;
    for(int i = starta; i <= finisha; i++){
        for(int j = startb; j <= finishb; j++){
            cofficient = terms[i].coaf*terms[j].coaf;
            expon = terms[i].expon*terms[j].expon;
            Solve(startd, finishd, cofficient, expon);
        }
    }
    sort(terms+(*startd), terms+(*finishd)+1, CMP);
}

void print(int start, int finish)
{
    for(int i = start; i <= finish; i++){
        cout << terms[i].coaf << " " << terms[i].expon << endl;
    }
}

int main()
{
    int starta, finisha, startb, finishb, startd, finishd;
    starta = finisha = 0; // init
    startb = finishb = 0;
    init(&starta, &finisha, &startb, &finishb); //read_poly
    padd(starta, finisha, startb, finishb, &startd, &finishd);
    Mult(starta, finisha, startb, finishb, &startd, &finishd);
    print(startd, finishd); //print_poly
    return 0;
}

将《数据结构》中的多项式实现了一下,嗯,勇敢的迈出第一步吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值