数据结构-多项式

来源:互联网 发布:怎么做钓鱼软件 编辑:程序博客网 时间:2024/04/30 10:26
#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
原创粉丝点击