15.用線性表實(shí)現(xiàn)多項(xiàng)式的加法和乘法
/*用線性表實(shí)現(xiàn)多項(xiàng)式的加法和乘法*/
#include<iostream>
#include<cstdlib>
#include<Vector>
#include<cmath>
using namespace std;
/*使用模板創(chuàng)建一個(gè)因子的結(jié)構(gòu)*/
template<typename T>
struct Polynomia{
T num; //num表示實(shí)系數(shù);
char ch; //ch表示未知數(shù);
int i; //i表示指數(shù);
};
/*對(duì)加號(hào)的重載*/
template<typename T>
Polynomia<T> operator+(Polynomia<T> const& lhs,Polynomia<T> const& rhs)
{
Polynomia<T> P1;
if(lhs.ch==rhs.ch){
P1.num=lhs.num+rhs.num;
P1.ch=lhs.ch;
if(lhs.i==rhs.i||lhs.i!=0){
P1.i=lhs.i;
}
else{
P1.i=rhs.i;
}
}
return P1;
}
/*對(duì)乘號(hào)的重載*/
template<typename T>
Polynomia<T> operator*(Polynomia<T> const& lhs,Polynomia<T> const& rhs)
{
Polynomia<T> P2;
if(lhs.num==0||rhs.num==0){
P2.num=0;
P2.ch=lhs.ch;
P2.i=0;
}
else{
P2.num=lhs.num*rhs.num;
P2.ch=lhs.ch;
P2.i=lhs.i+rhs.i;
}
return P2;
}
/*找出最大指數(shù)*/
template<typename T1>
T1 max(T
{
if(a>=b) return a;
else return b;
}
typedef Polynomia<double> PP;
int main()
{
double x; //x存儲(chǔ)實(shí)系數(shù);
char ch2,ch1,ch0; //ch0存儲(chǔ)未知元,ch1存儲(chǔ)括號(hào),ch2存儲(chǔ)運(yùn)算符號(hào);
int a,count=0,Max=0; //Max存儲(chǔ)最大指數(shù);
Polynomia<double> P,P0; //P,P0存儲(chǔ)因子;
std::vector<PP> vector1,vector2,vector3; //vector1,vector2,vector3分別存儲(chǔ)參加運(yùn)算的多項(xiàng)式
//和得出的結(jié)果;
vector1.reserve(1000);
vector2.reserve(1000);
vector3.reserve(1000); //給線性表分配空間;
P.num=0;
P.ch='y';
P.i=0;
P0.num=0;
P0.ch='y';
P0.i=0; //結(jié)構(gòu)的初始化;
for(count=0;count<100;count++){ //向量的初始化;
vector1.push_back(P);
vector2.push_back(P);
vector3.push_back(P);
}
cout<<"請(qǐng)輸入多項(xiàng)式(形如(5y2+2y1)*(4y4+3y1)=)"<<endl;
cout<<"注意括號(hào)不可少!"<<endl<<endl;
cin>>ch1;
while(ch1!='(') {cin>>ch1;} //以括號(hào)區(qū)分兩個(gè)多項(xiàng)式,并存入向量;
while(ch1!=')'){
cin>>x>>ch0>>a;
P.num=x;
P.ch=ch0;
P.i=a;
vector1.operator[](a)=P;
Max=max(Max,a);
cin>>ch1;
}
cin>>ch2; //第二個(gè)多項(xiàng)式;
while(ch1!='(') {cin>>ch1;}
while(ch1!=')'){
cin>>x>>ch0>>a;
P.num=x;
P.ch=ch0;
P.i=a;
vector2.operator[](a)=P;
Max=max(Max,a);
cin>>ch1;
}
if(ch2=='+'){ //進(jìn)行加法運(yùn)算;
for(count=0;count<=Max;count++){
vector3.operator[](count)=vector1.operator[](count)+vector2.operator[](count);
}
}
if(ch2=='*'){ //進(jìn)行乘法運(yùn)算;
for(int count1=0;count1<=2*Max;count1++){
for(int count2=0;count2<=count1;count2++){
P0=P0+(vector1.operator[](count2)*vector2.operator[](count1-count2));
}
vector3.operator[](count1)=P0;
P0.num=0;
P0.ch='y';
P0.i=0;
}
}
cout<<"結(jié)果為:";
for(int m=0,n=0;m<=2*Max;m++){ //控制輸出;
if((vector3.operator[](m)).num!=0){
n==0?cout<<" ":cout<<"+";
n++;
cout<<(vector3.operator[](m)).num<<(vector3.operator[](m)).ch<<(vector3.operator[](m)).i;
}
}
cout<<endl<<endl<<endl;
return 0;
聯(lián)系客服