C++高次多项式相加

C++编写高次多项式相加——数据结构课设

主要题意

输入两个多项式,输出两个多项式相加的每个项的次数的升序形式。
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、对于有负号的项,注意更新每次是否为负数的布尔值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值