#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;
}
将《数据结构》中的多项式实现了一下,嗯,勇敢的迈出第一步吧