多项式相乘
∙ 问题描述
此程序解决的是一元多项式相乘的问题。定义两个一元多项式,然后进行两个一元多项式的相乘。最后得到一个结果,并按升幂输出最终的多项式。 ∙ 设计思路
定义一个结构体,里面包含一元多项式的符号、系数、指数。对多项式进行输入时,先输入多项式的项数,然后从第一项的系数开始输入,然后输入第一项的指数,直至第一项输入完毕。然后开始输入第二项,输入第二项的方法与输入第一项的方法相同。在进行相乘时,用第二项的每个元素去乘第一项的每个元素。最终合并同类项的时候,把后面指数项加到与前面有共同指数的项的上面,然后删除该项。
∙
∙ 数据结构设计 功能函数设计 将多项式因子的符号、系数、指数封装成一个结构为顺序表类型
void sort(LinkYinzi& Head)排序函数,采用冒泡排序对多项式进行排序 void PrintList(const LinkYinzi Head)输出多项式函数
void Creat_List(LinkYinzi& Head, int num)创建多项式函数
void DelList(LinkYinzi& Head, int n)删除多项式中某一项函数
void multip(const LinkYinzi Head1, const LinkYinzi Head2)多项式相乘函数 void menu_elect( LinkYinzi Head1, LinkYinzi Head2)功能选择函数
∙ 程序代码
#include
using namespace std;
typedef struct Yinzi{
char sign;
float coef;//系数
int expn;//指数
Yinzi* next;
}Yinzi,*LinkYinzi;
void sort(LinkYinzi& Head){
LinkYinzi Q;//采用冒泡排序对多项式进行排序
for(LinkYinzi P1 = NULL; P1 != Head->next->next; P1 = Q)
for(LinkYinzi P2 = Head->next; P2->next != P1; P2 = P2->next){
if(P2->expn > P2->next->expn){
int temp1;
double temp2;
char temp3; //temp3是交换变量
temp2 = P2->coef;
P2->coef = P2->next->coef;
P2->next->coef = temp2;
temp3 = P2->sign;
P2->sign = P2->next->sign;
P2->next->sign = temp3;
temp1 = P2->expn;
P2->expn = P2->next->expn;
P2->next->expn = temp1;
}
Q = P2->next;//此处让Q 为本次执行后的P2的下一个,以便P1=Q让P1成为P2的下一个,作为下一次循环的结束标志。
}
}//冒泡排序(升序)
void PrintList(const LinkYinzi Head){
LinkYinzi p = Head ->next;
if(p != NULL ){
if(p->coef != 0){//系数不为0
if(p->expn != 0){//指数不为0
if(p->expn != 1){
if(p->coef == 1)
cout expn;
else
cout coef expn;
}
else{
if(p->coef == 1)
cout
else
cout coef
}
}
else
cout coef;
}
p = p->next;
}//输出第一项
while(p != NULL){ if(p->sign == '+'){ if(p->coef != 0){ if(p->expn != 0){ if(p->expn != 1){ if(p->coef == 1) cout expn; else cout coef expn;
}
else{
if(p->coef == 1)
cout
else
cout coef
}
}
else
cout coef;
}
else{
p = p->next;
continue;
}
}
if(p->sign == '-'){
if(p->coef != 0){
if(p->expn != 0){
if(p->expn != 1){
if(p->coef == -1)
cout expn;
else
cout coef expn;
}
else{
if(p->coef == -1)
cout
else
cout coef
}
}
else
cout coef;
}
else{
p = p->next ;
continue;
}
}
p = p->next;
}
}//输出其余的项
void Creat_List(LinkYinzi& Head, int num){
cout
int n;
cin >> n;
LinkYinzi p = Head;
cout
for(int i = 0; i
LinkYinzi Node = new Yinzi;
cout
cin >> Node->coef;
if(Node->coef > 0)
Node->sign = '+';
if(Node->coef
Node->sign = '-';
cout
cin >> Node ->expn;
Node->next = p->next;
p->next = Node;
p = p->next;
}
p->next = NULL;
cout
cout
sort(Head);
PrintList(Head);
cout
}//创建多项式
void DelList(LinkYinzi& Head, int n){
LinkYinzi p = Head;
for(int i = 0; i
p = p->next;
LinkYinzi Q ;
Q = p->next;
p->next = Q ->next ;
delete Q;
}//删除多项式的第n 个因式
void multip(const LinkYinzi Head1, const LinkYinzi Head2){
LinkYinzi Head3 = new Yinzi;
Head3->next = NULL;
LinkYinzi P1, P2, P3;
P3 = Head3;
for(P1 = Head1->next ; P1!=NULL; P1 = P1->next)
for(P2 = Head2->next ; P2!=NULL;){
LinkYinzi Node = new Yinzi;
Node->expn = P1->expn + P2->expn;
Node->coef = P1->coef * P2->coef;
if(Node->coef >= 0)
Node->sign = '+';
else
Node->sign = '-';
P2 = P2->next;
Node->next = P3->next;
P3->next = Node;
P3 = P3->next;
}//用P2的元素去乘P1的每个元素
sort(Head3);//排序,为合并同类项做基础
int i = 1;
for(LinkYinzi P = Head3->next; P->next != NULL;){
if(P->expn == P->next->expn){
P->coef += P->next->coef;
DelList(Head3,i+1);//把后面指数项加到与前面相同的指数项上面,然后删除该项
}
else{
P = P->next;
i++;
}
}//end for 为了合并同类项 排完序后若有同类项,则一定是位置上相邻的 cout
PrintList(Head3);
cout
}
void menu_elect( LinkYinzi Head1, LinkYinzi Head2){
int judge;
cout
cin >> judge;
switch(judge){
case 1: multip(Head1,Head2); break; case 0: exit(0);
default : cout
}
int main(){
int i = 1;
LinkYinzi Head1 = new Yinzi;
LinkYinzi Head2 = new Yinzi;
Head1->next = NULL;
Head2->next = NULL;
Creat_List(Head1,i);
Creat_List(Head2,i+1);
while(true){
int ju;
menu_elect(Head1,Head2);
cout
cin >> ju;
if(ju == 0)
break;
}
return 0;
}
运行与测试 0 = 否"
多项式相乘
∙ 问题描述
此程序解决的是一元多项式相乘的问题。定义两个一元多项式,然后进行两个一元多项式的相乘。最后得到一个结果,并按升幂输出最终的多项式。 ∙ 设计思路
定义一个结构体,里面包含一元多项式的符号、系数、指数。对多项式进行输入时,先输入多项式的项数,然后从第一项的系数开始输入,然后输入第一项的指数,直至第一项输入完毕。然后开始输入第二项,输入第二项的方法与输入第一项的方法相同。在进行相乘时,用第二项的每个元素去乘第一项的每个元素。最终合并同类项的时候,把后面指数项加到与前面有共同指数的项的上面,然后删除该项。
∙
∙ 数据结构设计 功能函数设计 将多项式因子的符号、系数、指数封装成一个结构为顺序表类型
void sort(LinkYinzi& Head)排序函数,采用冒泡排序对多项式进行排序 void PrintList(const LinkYinzi Head)输出多项式函数
void Creat_List(LinkYinzi& Head, int num)创建多项式函数
void DelList(LinkYinzi& Head, int n)删除多项式中某一项函数
void multip(const LinkYinzi Head1, const LinkYinzi Head2)多项式相乘函数 void menu_elect( LinkYinzi Head1, LinkYinzi Head2)功能选择函数
∙ 程序代码
#include
using namespace std;
typedef struct Yinzi{
char sign;
float coef;//系数
int expn;//指数
Yinzi* next;
}Yinzi,*LinkYinzi;
void sort(LinkYinzi& Head){
LinkYinzi Q;//采用冒泡排序对多项式进行排序
for(LinkYinzi P1 = NULL; P1 != Head->next->next; P1 = Q)
for(LinkYinzi P2 = Head->next; P2->next != P1; P2 = P2->next){
if(P2->expn > P2->next->expn){
int temp1;
double temp2;
char temp3; //temp3是交换变量
temp2 = P2->coef;
P2->coef = P2->next->coef;
P2->next->coef = temp2;
temp3 = P2->sign;
P2->sign = P2->next->sign;
P2->next->sign = temp3;
temp1 = P2->expn;
P2->expn = P2->next->expn;
P2->next->expn = temp1;
}
Q = P2->next;//此处让Q 为本次执行后的P2的下一个,以便P1=Q让P1成为P2的下一个,作为下一次循环的结束标志。
}
}//冒泡排序(升序)
void PrintList(const LinkYinzi Head){
LinkYinzi p = Head ->next;
if(p != NULL ){
if(p->coef != 0){//系数不为0
if(p->expn != 0){//指数不为0
if(p->expn != 1){
if(p->coef == 1)
cout expn;
else
cout coef expn;
}
else{
if(p->coef == 1)
cout
else
cout coef
}
}
else
cout coef;
}
p = p->next;
}//输出第一项
while(p != NULL){ if(p->sign == '+'){ if(p->coef != 0){ if(p->expn != 0){ if(p->expn != 1){ if(p->coef == 1) cout expn; else cout coef expn;
}
else{
if(p->coef == 1)
cout
else
cout coef
}
}
else
cout coef;
}
else{
p = p->next;
continue;
}
}
if(p->sign == '-'){
if(p->coef != 0){
if(p->expn != 0){
if(p->expn != 1){
if(p->coef == -1)
cout expn;
else
cout coef expn;
}
else{
if(p->coef == -1)
cout
else
cout coef
}
}
else
cout coef;
}
else{
p = p->next ;
continue;
}
}
p = p->next;
}
}//输出其余的项
void Creat_List(LinkYinzi& Head, int num){
cout
int n;
cin >> n;
LinkYinzi p = Head;
cout
for(int i = 0; i
LinkYinzi Node = new Yinzi;
cout
cin >> Node->coef;
if(Node->coef > 0)
Node->sign = '+';
if(Node->coef
Node->sign = '-';
cout
cin >> Node ->expn;
Node->next = p->next;
p->next = Node;
p = p->next;
}
p->next = NULL;
cout
cout
sort(Head);
PrintList(Head);
cout
}//创建多项式
void DelList(LinkYinzi& Head, int n){
LinkYinzi p = Head;
for(int i = 0; i
p = p->next;
LinkYinzi Q ;
Q = p->next;
p->next = Q ->next ;
delete Q;
}//删除多项式的第n 个因式
void multip(const LinkYinzi Head1, const LinkYinzi Head2){
LinkYinzi Head3 = new Yinzi;
Head3->next = NULL;
LinkYinzi P1, P2, P3;
P3 = Head3;
for(P1 = Head1->next ; P1!=NULL; P1 = P1->next)
for(P2 = Head2->next ; P2!=NULL;){
LinkYinzi Node = new Yinzi;
Node->expn = P1->expn + P2->expn;
Node->coef = P1->coef * P2->coef;
if(Node->coef >= 0)
Node->sign = '+';
else
Node->sign = '-';
P2 = P2->next;
Node->next = P3->next;
P3->next = Node;
P3 = P3->next;
}//用P2的元素去乘P1的每个元素
sort(Head3);//排序,为合并同类项做基础
int i = 1;
for(LinkYinzi P = Head3->next; P->next != NULL;){
if(P->expn == P->next->expn){
P->coef += P->next->coef;
DelList(Head3,i+1);//把后面指数项加到与前面相同的指数项上面,然后删除该项
}
else{
P = P->next;
i++;
}
}//end for 为了合并同类项 排完序后若有同类项,则一定是位置上相邻的 cout
PrintList(Head3);
cout
}
void menu_elect( LinkYinzi Head1, LinkYinzi Head2){
int judge;
cout
cin >> judge;
switch(judge){
case 1: multip(Head1,Head2); break; case 0: exit(0);
default : cout
}
int main(){
int i = 1;
LinkYinzi Head1 = new Yinzi;
LinkYinzi Head2 = new Yinzi;
Head1->next = NULL;
Head2->next = NULL;
Creat_List(Head1,i);
Creat_List(Head2,i+1);
while(true){
int ju;
menu_elect(Head1,Head2);
cout
cin >> ju;
if(ju == 0)
break;
}
return 0;
}
运行与测试 0 = 否"