C++ 合并同类项 求解
兄弟!你写程序难道没有注释……
前几天,俺们老师也留了这道题,把我的发给你看看!说实话,让别人读你的程序,不如你读别人的程序……
#include
using namespace std;
struct PloyNode
{
double coef;//系数域
int exp;//指数域
};
typedef PloyNode DataType;
class Node
{
friend class LinkList;
private:
DataType Data; //数据域
Node *next; //指针域
public:
Node() //构造函数
{
next = NULL;
}
Node(DataType x) //构造函数
{
Data = x;
next = NULL;
}
};
class LinkList //链表类
{
private:
Node *head1; //头指针1
Node *head2; //头指针2
int Size1; //链1的节点个数
int Size2; //链2的节点个数
public:
LinkList() //构造函数
{
head1 = new Node();
head2 = new Node();
Size1 = Size2 = 0;
}
~LinkList() //析构函数
{
Node *p, *q;
p = head1;
while(p != NULL)//析构表1
{
q = p;
p = p->next;
delete q;
}
Size1 = 0;
head1 = NULL;
p = head2;
while(p != NULL)//析构表2
{
q = p;
p = p->next;
delete q;
}
Size2 = 0;
head2 = NULL;
}
void Insert()//插入有序链表
{
int i, n1, n2;
Node *tail1, *tail2, *p, *r, *t;
PloyNode temp;
cout<<"请输入第一个多项式的项数:";
cin>>n1;
Size1 = n1;
for(i=1; i<=n1; i++)
{
cout<<"输入第一个多项式的第"<<i<<"项的系数:";
cin>>temp.coef;
cout<<"输入第一个多项式的第"<<i<<"项的指数:";
cin>>temp.exp;
p = new Node(temp); //新的构造节点
if(head1 ->next == NULL) //如果构造的是第一个节点
{
head1 ->next = tail1 = p;//就将尾指针和头指针都指向p
}
else //如果构造的不是第一个节点
{
r = head1; //将指针r指向头结点
t = r ->next; //将指针t指向第一个节点
while( (t != NULL) && (p ->Data.exp > t ->Data.exp) )//如果p指针所指向的新节点的指数 比 t指针指向的第一个节点的指数大
{ //并且这条链不止一个节点,那就将指针r和指针t向后移
r = t;
t = t ->next;
}
if(t == NULL) //如果p指针指向的新节点的指数 最大,那就将它插入到链尾
{
tail1 ->next = p;
tail1 = p; //将尾指针tail1指向p
}
else if(p ->Data.exp == t ->Data.exp) //假如p指针指向的新节点的指数 等于 链表中一项的指数,就合并
{
t ->Data.coef += p ->Data.coef;
Size1 --; //链表节点减一
}
else //如果p指针指向的新节点的指数 小于 t指针所指向的节点,就插入到它的前面
{
p ->next = t;
r ->next = p;
}
}
}
cout<<"请输入第二个多项式的项数:"; //以下同理
cin>>n2;
Size2 = n2;
for(i=1; i<=n2; i++)
{
cout<<"输入第一个多项式的第"<<i<<"项的系数:";
cin>>temp.coef;
cout<<"输入第一个多项式的第"<<i<<"项的指数:";
cin>>temp.exp;
p = new Node(temp); //新的构造节点
if(head2 ->next == NULL) //如果构造的是第一个节点
{
head2 ->next = tail2 = p;//就将尾指针和头指针都指向p
}
else //如果构造的不是第一个节点
{
r = head2; //将指针r指向头结点
t = r ->next; //将指针t指向第一个节点
while( (t != NULL) && (p ->Data.exp > t ->Data.exp) )//如果p指针所指向的新节点的指数 比 t指针指向的第一个节点的指数大
{ //并且这条链不止一个节点,那就将指针r和指针t向后移
r = t;
t = t ->next;
}
if(t == NULL) //如果p指针指向的新节点的指数 最大,那就将它插入到链尾
{
tail2 ->next = p;
tail2 = p; //将尾指针tail1指向p
}
else if(p ->Data.exp == t ->Data.exp) //假如p指针指向的新节点的指数 等于 链表中一项的指数,就合并
{
t ->Data.coef += p ->Data.coef;
Size2 --; //链表节点减一
}
else //如果p指针指向的新节点的指数 小于 t指针所指向的节点,就插入到它的前面
{
p ->next = t;
r ->next = p;
}
}
}
}
void print1() //输出链表一
{
Node *p = NULL;
cout<<"共有"<<Size1<<"项,结果如下:"<<endl;
p = head1 ->next;
while(p != NULL)
{
coutData.coefData.exp<<"] ";
p = p ->next;
}
cout<<endl;
}
void print2() //输出链表二
{
Node *p = NULL;
cout<<"共有"<<Size2<<"项,结果如下:"<<endl;
p = head2 ->next;
while(p != NULL)
{
coutData.coefData.exp<<"] ";
p = p ->next;
}
cout<<endl;
}
void Add() //两链表相加
{
Node *per = head1;
Node *p = per ->next;
Node *q = head2 ->next;
Node *del = NULL;
while((p != NULL) && (q != NULL))//当p或q有一个为空时
{
if(p ->Data.exp Data.exp) //p结点是和多项式中的一项 p后移,q不动
{
per = p;
p = p ->next;
}
else if(p ->Data.exp > q ->Data.exp)//q结点是和多项式中的一项 将q插在p之前,q后移,p不动
{
per ->next = q;
per = q;
q = q ->next;
per ->next = p;
Size1++;
Size2--;
}
else
{
p ->Data.coef += q ->Data.coef;//修改p系数域, 释放q,p,q后移
if(p ->Data.coef == 0)//当系数为零时,从1表中删去p, 释放p,q,p,q后移
{
del = p;
p = p ->next;
delete del;
per ->next = p;
Size1--;
}
del = q;
q = q ->next;
delete del;
Size2--;
}
}
if(p == NULL)//将表2中剩余部分连到表1上
{
per ->next = q;
Size1 += Size2;
}
head2 = NULL;
}
};
int main()
{
LinkList myList;
myList.Insert();
system("cls");
cout<<"
单项式的格式:[系数 指数]
"<<endl;
cout<<"
合并同类项后……"<<endl;
cout<<"-----------------------------------------------------------"<<endl;
cout<<"
多项式一";
myList.print1();
cout<<"
多项式二";
myList.print2();
cout<<"-----------------------------------------------------------"<<endl;
myList.Add();
cout<<"
多项式的和";
myList.print1();
system("PAUSE");
return 0;
}
哎!缩进也没了!你还是把它复制运行一下看看!
如图
#include <iostream>
#include <map>
#include <string>
#include <sstream>
using namespace std;
int main()
{
map<int,int> imap;
string line;
getline(cin,line);
istringstream str1(line);
int num,ord;
while (str1 >> num >> ord){
imap[ord] = num;}
getline(cin,line);
istringstream str2(line);
while (str2 >> num >> ord){
imap[ord] += num;}
map<int,int>::reverse_iterator iter = imap.rbegin();
bool flag = true;
while (iter != imap.rend()){
if (iter->second != 0){
flag = false;
cout << iter->second << " " << iter->first;
iter++;
if (iter != imap.rend())
cout << " ";}
else iter++;
}
if (flag) cout << 0;
}
楼主用map容器吧,简单一些,已AC~ 最后一个测试点是所有项系数相加后都为零,我错了两次,发现出题人意图是此时输出一个0,然后就AC啦
pls give the requirement
涂卞易善: 如果类似 2*X的3次方 + X的一次方 你存储为 2 0 1 这个直接加就好了 如果你把系数为0的多项式省略掉 存储为 2 1 相加的时候要用归并
宁县15569443318: 合并同类项:(1/3a - 3/4b+5c) - (3/4a - 1/3b - 3c) 写过程 谢谢 跪求 - ?
涂卞易善: (1/3a-3/4b+5c)-(3/4a-1/3b-3c)=(1/3a-3/4a)+(-3/4b+1/3b)+(5c+3c)=1/12a-5/1...
宁县15569443318: 合并同类项求过程和答案 - ?
涂卞易善: 合并同类项 1. 3f+2f-7f 2. x-f+5x-4f 3. 2a+3b+6a+9b-8a+12b 4. 3pq+7pq+4pq+pq 5. 30a²b+2b²c-15a²b-4b²c 6. 7xy-8wx+5xy-12xy
宁县15569443318: 合并同类项和求值 - ?
涂卞易善: 不一样,合并同类项为把相同的试子放在一起算,求值为最终结果 例子:2xy+2xyz-9x-8y+3xy-(3xyz+5x)+(9x+8y) =-9x-8y+2xy+2xyz-3xyz-5x+9x+8y =2xy-3xyz-5x
宁县15569443318: 合并同类项的方法? - ?
涂卞易善: 1、同类项:所含字母相同,并且相同字母的指数也相同的项叫做同类项.几个常数项也是同类项 典题:如果-2x2yn和3xmy3是同类项,那么n= 3 ,m= 2 . 2、合并同类项:把多项式中的同类项合并成一项.合并后,所得项的系数是合并前各同类...
宁县15569443318: 合并同类项,求值要过程 - ?
涂卞易善: 9 =59/3 =-3*(-2)+4/9 =6+4/.5x^3y-1/5x^2y^2 =-y^4-3.5x^3y x=-2,y=0.3 =-0.0081-3;2x-2(x-1/3y^2)+(-3/2x+1Ǚx^2-[7x-(4x-3)-2x^2] =3x^2-[7x-4x+3-2x^2] =3x^2-7x+4x-3+2x^2 =5x^2-3x-3 1/,y=2/3y^2) =1/2x-2x+2/3y^2-3/.5*(-8)*0.3 =-0.0081+8;9 3y^4-4x^3y+0.2x^2y^2-4y^4+0;2x+1/3y^2 =-3x+y^2 x=-2
宁县15569443318: 合并同类项怎么做 . - ?
涂卞易善: 2x+8=3x-6 解: 1、先把带“x”的项移到左边,没带x的项移到右边.(如此题,可以理解为等式两边同时减8,这样等式仍成立.左边2x+8-8=2x,右边3x-6-8=3x-14.同样的,3x也这么处理.)可以得到:2x-3x=-6-8 2、合并同类项.不会的话...
宁县15569443318: 合并同类项的格式!! 求解!! ! - ?
涂卞易善: 知道啊,太简单啦~第一个空:系数相加,把指数和底数照抄所得结果作为:同类项的系数,指数和底数不变祝你学习进步哦`
宁县15569443318: 合并同类项; - ?
涂卞易善: -2x³+5x²-0.5x³-4x²-x³=(-2x³-0.5x³-x³)+(5x²-4x²)=-3.5x³+x²5x³-4x²y+2xy²-3x²y-7xy²-5x³=(5x³-5x³)+(-4x²y-3x²y)+(2xy²-7xy²)=-7x²y-5xy²
宁县15569443318: 怎么算合并同类项?
涂卞易善: 6AB-4AC+8AB-3AC =(6+8)AB-(4+3)AB 此处括号外面加括号里面的符号应该等于原式的符号,就是说,括号前面的符号在打开同类项时要分配到这个括号里每一个数字前,-(4+3)=-4-3, 就是-4和-3 记住,负号碰正号是负,负负得正,负号碰负号就是正的比如-8XY+3XY=-(8XY-3XY)打开就是-8XY-(-3XY)=-8XY+3XY4XY+2AB-3XY+4AB =(4-3)XY+(2+4)AB=XY+6AB