纯模拟法:模拟手工求法
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define Maxsize 1001
using namespace std;
typedef struct Mul{
//指数
int index[Maxsize];
//系数
int coefficient[Maxsize];
//项数
int n;
}Mul,*Mulp;
//交换
void exchange(int &a,int &b){
a = a^b;
b = a^b;
a = a^b;
}
//按指数排序
void sortMul(Mulp n){
for(int i = 0 ; i<n->n ;i++)
for(int j = i;j<n->n ;j++){
if(n->index[i]<n->index[j]){
exchange(n->index[i],n->index[j]);
exchange(n->coefficient[i],n->coefficient[j]);
}
}
}
//addition
void add(Mulp n1,Mulp n2,Mulp n3){
int i = 0;
int j = 0;
int z = 0;
int index,coefficient;
//基于合并思想
while(i<n1->n&&j<n2->n){
//相等则合并
if(n1->index[i]==n2->index[j]){
index = n1->index[i];
coefficient = n1->coefficient[i]+n2->coefficient[j];
i++;
j++;
}else if(n1->index[i]>n2->index[j]){
index = n1->index[i];
coefficient = n1->coefficient[i];
i++;
}else{
index = n2->index[j];
coefficient = n2->coefficient[j];
j++;
}
n3->index[z] = index;
n3->coefficient[z++] = coefficient;
}
//将长的往后赋值
while(i<n1->n){
n3->index[z] = n1->index[i];
n3->coefficient[z++] = n1->coefficient[i++];
}
while(j<n2->n){
n3->index[z] = n2->index[j];
n3->coefficient[z++] = n2->coefficient[j++];
}
n3->n = z;
}
//multiplication
void multiply(Mulp n1,Mulp n2,Mulp n3){
int z = 0;
int index;
int coefficient;
int flag;
for(int i = 0; i<n1->n; i++){
for(int j = 0; j<n2->n; j++){
index = n1->index[i]+n2->index[j];
coefficient = n1->coefficient[i]*n2->coefficient[j];
flag = 0;
//合并同类项
for(int k = z ; k>=0 ; k--){
if(index==n3->index[k]&&index!=0){
n3->coefficient[k]+=coefficient;
n3->index[k] = index;
flag = 1;
break;
}
}//无同类项
if(!flag){
n3->index[z] = index;
n3->coefficient[z++] = coefficient;
}
}
}
n3->n = z;
//按指数排序
sortMul(n3);
}
//input
void inputNode(Mulp node,int n){
//cout<<"n: "<<n<<endl;
node->n = n;
for(int i = 0 ;i<n ;i++)
cin>>node->coefficient[i]>>node->index[i];
}
//show
void showNodes(Mulp node){
int k = 0;
for(int i = 0 ; i<node->n ;i++){
//避免输出系数为0项
if(node->coefficient[i]==0)
continue;
if(k)
cout<<" "<<node->coefficient[i]<<" "<<node->index[i];
else
cout<<node->coefficient[i]<<" "<<node->index[i];
k++;
}
//如果所有的系数都为0
if(k==0)
cout<<"0 0";
cout<<endl;
}
int main(){
Mulp node1 = (Mulp)malloc(sizeof(struct Mul));
Mulp node2 = (Mulp)malloc(sizeof(struct Mul));
Mulp node3 = (Mulp)malloc(sizeof(struct Mul));
int n;
cin>>n;
inputNode(node1,n);
cin>>n;
inputNode(node2,n);
multiply(node1,node2,node3);
showNodes(node3);
add(node1,node2,node3);
showNodes(node3);
return 0;
}
桶排思想:借助数组下标实现同类项合并与排序
#include <iostream>
#include <cstring>
using namespace std;
struct node{
int a, p;
};
struct node n[1000], m[1000];
int sum[2005];
int mul[4005];
int main(){
int x, y, k;
memset(sum, 0, sizeof(sum));
memset(mul, 0, sizeof(mul));
cin >> x;
//将第1个多项式放到n中
//sum用于存和,偏移1000用于存放负数,下标:指数,内容:系数
for (int i = 0; i < x; i++) {
cin >> n[i].a >> n[i].p;
sum[n[i].p + 1000] += n[i].a;
}
cin >> y;
//第二个式子输入时顺便求和
//将第2个式子放到m中
for (int i = 0; i < y; i++) {
cin >> m[i].a >> m[i].p;
sum[m[i].p + 1000] += m[i].a;
}
//求和,乘法时偏移2000
for (int i = 0; i < x; i++)
for (int j = 0; j < y; j++)
mul[n[i].p + m[j].p + 2000] += n[i].a * m[j].a;
//控制乘积中抵消项的情况
k = 0;
for (int i = 4000; i >= 0; i--)
if (mul[i] != 0){
if (k == 0)
cout << mul[i] << " " << i - 2000;
else
cout << " " << mul[i] << " " << i - 2000;
k++;
}
if (k == 0)
cout << "0 0";
cout << endl;
//加和
k = 0;
for (int i = 2000; i >= 0; i--)
if (sum[i] != 0) {
if (k == 0)
cout << sum[i] << " " << i - 1000;
else
cout << " " << sum[i] << " " << i - 1000;
k++;
}
if (k == 0)
cout << "0 0";
return 0;
}