主要题意
输入两个多项式,输出两个多项式相加的每个项的次数的升序形式。
eg:
input:(输入输出均无多余的空格)
-5x^2+100+5x+90x^4
3x+4x^2+7-15x^3+10000000x^10000000
output:
107+8x-x^2-15x^3+90x^4+10000000x^10000000
代码
#include<iostream>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
struct cirlum
{
int k;
int a;
};
vector<cirlum>b1;
vector<cirlum>b2;
int bg,ed;
int is_fu;
bool is_ok_c(string a,char tem){
for (int i = 0; i < a.length(); ++i)
{
if (a[i]=='^'||a[i]==tem)
{
return false;
}
}
return true;
}
bool judge(cirlum tem1,cirlum tem2){
return tem1.a<=tem2.a;
}
int main(int argc, char const *argv[])
{
string st1,st2,temst;
char ch;
// freopen("e.txt","r",stdin);
bg=0,ed=0;
cin>>st1>>st2;
for (int i = 0; i < st1.length(); ++i)
{
if ((st1[i]<='z'&&st1[i]>='a')||(st1[i]<='Z'&&st1[i]>='A'))
{
ch = st1[i];
}
}
// cout<<ch<<endl;
st1+='+';
st2+='+';
// cout<<st1<<" ????????? "<<st2<<endl;
for (int i = 0; i < st1.length(); ++i)
{
if (st1[i]=='+'||st1[i]=='-')
{
ed=i;
temst=st1.substr(bg,ed-bg);
bg=ed;
string numst,ast;
int num,anum;
bool is_k=1;
// cout<<temst<<endl;
for (int i = 0; i <temst.length(); ++i)
{
if (temst[i]=='^')
{
is_k=0;
}
if (temst[0]=='-')
{
is_fu=1;
}
if (temst[i]<='9'&&temst[i]>='0'&&is_k)
{
numst+=temst[i];
}
if (temst[i-1]=='^')
{
ast=temst.substr(i,temst.length()-i);
anum=stoi(ast);
}
// cout<<numst<<" "<<ast<<endl;
// cout<<numst<<" "<<endl<<endl;
if(is_ok_c(temst,ch)){ //单一的常数
temst.erase(temst.begin());
// cout<<temst<<endl;
string stc;
for (int i = 0; i < temst.length(); ++i)
{
stc+=temst[i];
}
num = stoi(stc);
cirlum temcirlum;
if (is_fu==1)
{
num=-num;
}
temcirlum.k = num;
temcirlum.a=0;
b1.push_back(temcirlum);
is_fu=0;
}
else if (temst[i]==ch&&temst[i+1]!='^')
{
num=stoi(numst);
// cout<<"yici "<<num<<endl;
cirlum temcirlum;
if (is_fu==1)
{
num=-num;
}
temcirlum.k = num;
temcirlum.a=1;
b1.push_back(temcirlum);
is_fu=0;
}
else if(i==temst.length()-1)
{
// cout<<numst<<endl;
num=stoi(numst);
// cout<<"shuzi1 "<<num<<endl;
cirlum temcirlum;
temcirlum.k=num;
if (is_fu==1)
{
temcirlum.k=-num;
}
temcirlum.a=anum;
b1.push_back(temcirlum);
is_fu=0;
}
}
}
}
bg=0,ed=0;
// cout<<endl<<endl;
// cout<<st2<<endl<<endl;
for (int i = 0; i < st2.length(); ++i)
{
if (st2[i]=='+'||st2[i]=='-')
{
ed=i;
temst=st2.substr(bg,ed-bg);
bg=ed;
// cout<<temst<<" "<<i<<" 222"<<endl;
string numst,ast;
int num,anum;
bool is_k=1;
// cout<<temst<<endl;
for (int i = 0; i <temst.length(); ++i)
{
if (temst[i]=='^')
{
is_k=0;
}
if (temst[0]=='-')
{
is_fu=1;
}
if (temst[i]<='9'&&temst[i]>='0'&&is_k)
{
numst+=temst[i];
}
if (temst[i-1]=='^')
{
ast=temst.substr(i,temst.length()-i);
anum=stoi(ast);
}
// cout<<numst<<" "<<endl;
if(is_ok_c(temst,ch)){ //单一的常数
temst.erase(temst.begin());
// cout<<temst<<endl;
string stc;
for (int i = 0; i < temst.length(); ++i)
{
stc+=temst[i];
}
num = stoi(stc);
cirlum temcirlum;
if (is_fu==1)
{
num=-num;
}
temcirlum.k = num;
temcirlum.a=0;
b2.push_back(temcirlum);
is_fu=0;
}
else if (temst[i]==ch&&temst[i+1]!='^')
{
num=stoi(numst);
cirlum temcirlum;
if (is_fu==1)
{
num=-num;
}
temcirlum.k = num;
temcirlum.a=1;
b2.push_back(temcirlum);
is_fu=0;
}
else if (i==temst.length()-1)
{
// cout<<numst<<endl;
num=stoi(numst);
// cout<<"shuzi "<<num<<endl;
cirlum temcirlum;
temcirlum.k=num;
if (is_fu==1)
{
temcirlum.k=-num;
}
temcirlum.a=anum;
b2.push_back(temcirlum);
is_fu=0;
}
}
}
}
// cout<<endl<<endl;
// for (int i = 0; i < b1.size(); ++i)
// {
// cout<<b1[i].k<<" "<<b1[i].a<<endl;
// }
// cout<<endl<<endl;
// for (int i = 0; i < b2.size(); ++i)
// {
// cout<<b2[i].k<<" "<<b2[i].a<<endl;
// }
// cout<<endl<<endl;
for (int i = 0; i < b2.size(); ++i)
{
b1.push_back(b2[i]);
}
sort(b1.begin(),b1.end(),judge);
for (int i = 0; i < b1.size(); ++i)
{
if (b1[i].k==0)
{
// cout<<"shi 000000000 "<<i<<endl;
b1.erase(b1.begin()+i);
}
}
// cout<<endl<<"???????????????";
// for (int i = 0; i < b1.size(); ++i)
// {
// cout<<b1[i].k<<" "<<b1[i].a<<endl;
// }
// for (int i = 0; i < b1.size()-1; ++i)
// {
// if (b1[i].a==b1[i+1].a)
// {
// int temi=i+1;
// while(temi<b1.size()&&b1[temi].a==b1[temi].a){
// b1[i].k+=b1[temi++].k;
// }
// for (int p = temi; p >=i+1 ; p--)
// {
// b1.erase(b1.begin()+p);
// }
// }
// cout<<i<<" ??? "<<b1.size()<<endl;
// if (b1[i].k==0)
// {
// b1.erase(b1.begin()+i);
// }
// }
for (int i = 0; i < b1.size()-1; ++i)
{
if (b1[i].a==b1[i+1].a)
{
// cout<<"cadierge"<<endl;
b1[i].k+=b1[i+1].k;
b1.erase(b1.begin()+i+1);
}
if (b1[i].k==0)
{
// cout<<"cadiyige"<<endl;
b1.erase(b1.begin()+i);
}
// b1.erase(b1.begin()+i+1);
}
// cout<<endl<<"chulai";
// for (int i = 0; i < b1.size(); ++i)
// {
// cout<<b1[i].k<<" "<<b1[i].a<<endl;
// }
if (b1[0].a==0)
{
cout<<b1[0].k;
}
else if (b1[0].a==1)
{
cout<<b1[0].k<<ch;
}
else cout<<b1[0].k<<ch<<"^"<<b1[0].a;
for (int i = 1; i < b1.size(); ++i)
{
if (b1[i].a==1)
{
if (b1[i].k>0)
{
if (b1[i].k==1)
{
cout<<"+"<<ch;
}
else cout<<"+"<<b1[i].k<<ch;
}
else {
if (b1[i].k==-1)
{
cout<<"-"<<ch;
}
else cout<<b1[i].k<<ch;
}
}
else{
if (b1[i].k>0)
{
if (b1[i].k==1)
{
cout<<"+"<<ch<<"^"<<b1[i].a;
}
else cout<<"+"<<b1[i].k<<ch<<"^"<<b1[i].a;
}
else {
if (b1[i].k==-1)
{
cout<<"-"<<ch<<"^"<<b1[i].a;
}
else cout<<b1[i].k<<ch<<"^"<<b1[i].a;
}
}
}
return 0;
}
注意点
1、高次多项式相加思路容易想到,将系数和指数通过结构体储存,通过创建一个结构体数组或结构体向量去进行相加操作。(上边代码用的是向量,对元素进行操作相对容易)。
2、代码并未考虑(并未实现多个相同次数的相加,即一个式子中同时出现2x,5x,x……虽然不会那么写多项式,不过情况也要考虑,后续有空再写)
易错点
1、用向量的erase()函数对向量元素进行操作时要注意该向量的size也会对应减小,这会引起循环体中的i会出现超过向量的size的情况,从而引起向量越界报错。
eg:
vector<int>b;
b.push_back(2);
b.push_back(3);
b.push_back(4);
b.push_back(5);
b.erase(b.begin()+2);
cout<<b.size()<<endl; //此时输出3(因为被拿掉了一个元素)
b.erase(b.begin());
cout<<b.size()<<endl; //输出2
2、对于有负号的项,注意更新每次是否为负数的布尔值。