C++实现多项式相乘
C++多项式相乘
#include <iOStream>
using namespace std;
int a[2][2]; //二维数组开的秒
int b[2][2];
int ans[25]; //用来存放系数,那么存放后所对应的下标就是指数
int main(){
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
cin >> a[i][j];
}
}
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
cin >> b[i][j];
}
}
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
ans[a[i][1] + b[j][1]] += a[i][0] * b[j][0];
//幂次就是对应的下标
} //累加的原因是,因为是两个相加的式子相乘,所以要合并幂次相同的项
}
for(int i = 20;i>=0;i--){
if(ans[i] != 0){
cout << ans[i] << " " << i << endl;
}
}
return 0;
}
C++多项式的乘法和加法
多项式的乘法和加法
采用动态数组的方法
该方法较链式方法略微复杂
#include<iostream>
using namespace std;
//多项式的乘法和加法
struct node{
int coef;
int exp;
};
//****排序****
void nodesort(node* pn,const int& count)
{ if(count<=1) return;
else{
bool flag =false;
for(int i=0;i<count-1&&!flag;++i){
flag = true;
for(int j=1;j<count-i;++j){
node t;
if(pn[j-1].exp<pn[j].exp) {
t = pn[j];
pn[j] = pn[j-1];
pn[j-1] = t;
flag = false;
}
}
}
}
}
//****输出****
void print( node *s,const int& n)
{
cout<<"*********output*********\n";
for(int i=0;i<n;++i)
{ if(i!=n-1)
cout<*<s[i].coef<<"x^"<<s[i].exp<<" + ";
else cout<<s[i].coef<<"x^"<<s[i].exp<<endl;
}
cout<<endl;
}
//****合并同类项****
int nodemerge(node* s,const int& n ,const int& key=0){
if(n<1) {cerr<<"数组大小有误\n";}
if(n==1)return 1;
if(n>1 && key==0){//排序并且合并
nodesort(s,n);
int count=0;
for(int i=1;i<n;++i)
{
if(s[count].exp==s[i].exp){
s[count].coef = s[count].coef + s[i].coef ;
}
else{
s[++count] = s[i];
}
}
return count+1;
}
if(n>1&&key==1){//仅合并
//nodesort(s,n);
int count=0;
for(int i=1;i<n;++i)
{
if(s[count].exp==s[i].exp){
s[count].coef = s[count].coef + s[i].coef ;
}
else{
s[++count] = s[i];
}
}
return count+1;
}
}
//***计算多项式加法***
void add(node* s,const int& m,node* a,const int& n)
{
node* newnode = new node[m+n];
int i=0,j=0,temp=0;
while(i<m && j<n){
if(s[i].exp>a[j].exp){
newnode[temp].coef = s[i].coef;
newnode[temp].exp = s[i].exp;
temp++;
i++;
}
else if(s[i].exp<a[j].exp){
newnode[temp].coef = a[j].coef;
newnode[temp].exp = a[j].exp;
temp++;
j++;
}
else {
newnode[temp].coef = a[j].coef+s[i].coef;
newnode[temp].exp = a[j].exp;
temp++;
i++;
j++;
}
}
while(i<m)
{
newnode[temp].coef = s[i].coef;
newnode[temp].exp = s[i].exp;
temp++;
i++;
}
while(j<n)
{
newnode[temp].coef = a[j].coef;
newnode[temp].exp = a[j].exp;
temp++;
j++;
}
temp = nodemerge(newnode,temp,1);
cout<<"多项式加法\n";
print(newnode,temp);
delete[] newnode;
return ;
}
//***计算多项式乘法***
void multi(node* s,const int& m,node* a,const int& n)
{
node* pn = new node[m*n];
int count = 0;
for(int i=0;i<m;++i)
{
for(int j=0;j<n;++j){
pn[count].coef = (s[i].coef) * (a[j].coef) ;
pn[count].exp = s[i].exp + a[j].exp;
count++;
}
}
//***排序并且合并***
count = nodemerge(pn,count,0);
cout<<"多项式乘法\n";
print(pn,count);
delete[] pn;
return ;
}
//****输入数据*****
node* node_input(const int& n)
{
node* seq = new node[n];
for(int i=0;i<2*n;++i)
{
if(i%2==0) cin>>seq[i/2].coef;
else cin>>seq[i/2].exp;
}
return seq;
}
//***销毁****
void delete_node(node*s){
delete[] s;
}
//**测试**
int main(){
//m,n表示输入的节点个数
//示例:3x^6+4x^4+x 输入的个数为3,每个节点分别为:3 6; 4 4; *1 *1
int m,n;
int temp;
node* seq1,*seq2;
cout<<"input m value:";
cin>>m;
seq1 = node_input(m);
cout<<"input n value:";
cin>>n;
seq2 = node_input(n);
//***排序并且合并***
m=nodemerge(seq1,m);
n =nodemerge(seq2,n);
//test
print(seq1,m);
print(seq2,n);
multi(seq1,m,seq2,n);
add(seq1,m,seq2,n);
//delete
delete_node(seq1);
delete_node(seq2);
return 0;
}
样例测试输出
input m value:3
1 2
1 3
2 4
input n value:4
3 5
3 76
3 4
2 5
*********output*********
2x^4 + 1x^3 + 1x^2*********output*********
3x^76 + 5x^5 + 3x^4多项式乘法
*********output*********
6x^80 + 3x^79 + 3x^78 + 10x^9 + 11x^8 + 8x^7 + 3x^6多项式加法
*********output*********
3x^76 + 5x^5 + 5x^4 + 1x^3 + 1x^2
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
相关文章