C语言多项式加法
C语言实现多项式的相加
C语⾔实现多项式的相加本⽂实例为⼤家分享了C语⾔多项式相加的具体代码,供⼤家参考,具体内容如下包含带头节点的链表的初始化,输出:#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>typedef struct Pol{int coe; // 系数int index; // 指数struct Pol *next;}Pol;int main(int argc, char *argv[]){Pol *head1 = NULL; // 第⼀个多项式Pol *head2 = NULL; // 第⼆个多项式Pol *Initiate(Pol *head1); // 声明初始化函数void Output(Pol *head); // 声明输出函数void PolAdd(Pol *head1, Pol *head2); // 声明相加函数int coe, index;char sign;Pol *p;int n = 0;// 初始化第⼀个多项式head1 = Initiate(head1);p = head1;while (1){scanf("%dx%d%c", &coe, &index, &sign);p->next = (Pol *)malloc(sizeof(Pol));p = p->next;p->coe = coe;p->index = index;p->next = NULL;if(sign == '\n')break;}printf("第⼀多项式输⼊完毕。
\n");// 初始化第⼆个多项式head2 = Initiate(head2);p = head2;while (1){scanf("%dx%d%c", &coe, &index, &sign);p->next = (Pol *)malloc(sizeof(Pol));p = p->next;p->coe = coe;p->index = index;p->next = NULL;if (sign == '\n')break;}printf("第⼆多项式输⼊完毕。
多项式加法(C语言实现)
多项式加法#include <stdio.h>#include <stdlib.h>#define Max_Size 100typedef struct node{float coef;int expn;struct node *next;}PolyNode;int CreCoeStr(float C[]){char flag;int i=0;do{scanf("%f",&C[i++]);scanf("%c",&flag);} while (flag!='#');return(i);}void CreExpStr(int E[]){int i=0;char flag;do{scanf("%d",&E[i++]);scanf("%c",&flag);} while (flag!='#');}void InitPolyList(PolyNode **sq){if((*sq=(PolyNode *)malloc(sizeof(PolyNode)))==NULL) exit(1);(*sq)->next=NULL;}void CreatPolyList(PolyNode **sq,float C[],int E[],int num){int i;PolyNode *s,*r=*sq;for(i=0;i<num;i++){if((s=(PolyNode *)malloc(sizeof(PolyNode)))==NULL) exit(1);s->coef=C[i];s->expn=E[i];r->next=s;r=s;}r->next=NULL;}void InsertSortPoly(PolyNode **sq){PolyNode *p,*q,*r,*u;p=(*sq)->next;(*sq)->next=NULL;while (p){r=*sq;q=(*sq)->next;while (q&&q->expn<=p->expn){r=q;q=q->next;}u=p->next;p->next=r->next;r->next=p;p=u;}}void DispList(PolyNode *sq){PolyNode *p=sq->next;while(p){printf("(%7.2f,%d)",p->coef,p->expn);p=p->next;}printf("\n");}PolyNode *AddPoly(PolyNode *sq_a,PolyNode *sq_b){PolyNode *p_1=sq_a->next,*p_2=sq_b->next,*tc,*p,*s,*pc;InitPolyList(&pc);tc=pc;while (p_1&&p_2){if(p_1->expn<p_2->expn){if((s=(PolyNode *)malloc(sizeof(PolyNode)))==NULL) exit(1);s->coef=p_1->coef;s->expn=p_1->expn;s->next=NULL;tc->next=s;tc=s;p_1=p_1->next;}else if(p_1->expn>p_2->expn){if((s=(PolyNode *)malloc(sizeof(PolyNode)))==NULL) exit(1);s->coef=p_2->coef;s->expn=p_2->expn;s->next=NULL;tc->next=s;tc=s;p_2=p_2->next;}else{if(p_1->coef+p_2->coef){if((s=(PolyNode *)malloc(sizeof(PolyNode)))==NULL) exit(1);s->coef=p_1->coef+p_2->coef;s->expn=p_1->expn;s->next=NULL;tc->next=s;tc=s;}p_1=p_1->next;p_2=p_2->next;}}if(p_1) p=p_1;else p=p_2;while (p){if((s=(PolyNode *)malloc(sizeof(PolyNode)))==NULL) exit(1);s->coef=p->coef;s->expn=p->expn;tc->next=s;tc=s;p=p->next;}tc->next=NULL;return pc;}void main(){PolyNode *sq_1,*sq_2,*sq_3;float C_1[Max_Size],C_2[Max_Size];int E_1[Max_Size],E_2[Max_Size],num_1,num_2;printf("\n\t\t两个多项式相加运算\n");printf("\n");printf("\n");printf("请输入多项式A 的各项系数(以‘#’结束): ");num_1=CreCoeStr(C_1);printf("\n请输入多项式A 的各项幂数(以‘#’结束): ");CreExpStr(E_1);printf("\n请输入多项式B 的各项系数(以‘#’结束): ");num_2=CreCoeStr(C_2);printf("\n请输入多项式B 的各项幂数(以‘#’结束): ");CreExpStr(E_2);InitPolyList(&sq_1);InitPolyList(&sq_2);CreatPolyList(&sq_1,C_1,E_1,num_1);CreatPolyList(&sq_2,C_2,E_2,num_2);printf("\n原多项式A :\n");DispList(sq_1);printf("\n原多项式B :\n");DispList(sq_2);InsertSortPoly(&sq_1);InsertSortPoly(&sq_2);printf("\n排列后的多项式A : \n");DispList(sq_1);printf("\n排列后的多项式B : \n");DispList(sq_2);sq_3=AddPoly(sq_1,sq_2);printf("\n多项式相加结果: \n");DispList(sq_3);printf("\n");}。
数据结构(C语言)用单链表存储一元多项式,并实现两个多项式的相加运算
#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef int ElemType;/*单项链表的声明*/typedef struct PolynNode{int coef; // 系数int expn; // 指数struct PolynNode *next;}PolynNode,*PolynList;/*正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表*/ /*指数系数一对一对输入*/void CreatePolyn(PolynList &L,int n){int i;PolynList p,q;L=(PolynList)malloc(sizeof(PolynNode)); // 生成头结点L->next=NULL;q=L;printf("成对输入%d个数据\n",n);for(i=1;i<=n;i++){p=(PolynList)malloc(sizeof(PolynNode));scanf("%d%d",&p->coef,&p->expn); //指数和系数成对输入q->next=p;q=q->next;}p->next=NULL;}// 初始条件:单链表L已存在// 操作结果: 依次对L的每个数据元素调用函数vi()。
一旦vi()失败,则操作失败void PolynTraverse(PolynList L,void(*vi)(ElemType, ElemType)){PolynList p=L->next;while(p){vi(p->coef, p->expn);if(p->next){printf(" + "); //“+”号的输出,最后一项后面没有“+” }p=p->next;}printf("\n");}/*ListTraverse()调用的函数(类型要一致)*/void visit(ElemType c, ElemType e){if(c != 0){printf("%dX^%d",c,e); //格式化输出多项式每一项}}/* 多项式相加,原理:归并 *//* 参数:两个已经存在的多项式 *//* 返回值:归并后新的多项式的头结点 */PolynList MergeList(PolynList La, PolynList Lb){PolynList pa, pb, pc, Lc;pa = La->next;pb = Lb->next;Lc = pc = La; // 用La的头结点作为Lc的头结点while(pa&&pb){if(pa->expn < pb->expn){pc->next = pa; //如果指数不相等,pc指针连上指数小的结点,pc = pa;pa = pa->next; //指向该结点的指针后移}else if(pa ->expn > pb->expn ){pc->next = pb; //pc指针连上指数小的结点,pc = pb;pb = pb->next; //指向该结点的指针后移}else//(pa ->expn = pb->expn ){pa->coef = pa->coef + pb->coef; //指数相等时,系数相加 pc->next = pa;pc = pa;pa = pa->next; //两指针都往后移pb = pb->next;}}pc->next = pa ? pa:pb; // 插入剩余段return Lc;}void main(){PolynList ha,hb,hc;printf("非递减输入多项式ha, ");CreatePolyn(ha,5); // 正位序输入n个元素的值printf("非递减输入多项式hb, ");CreatePolyn(hb,5); // 正位序输入n个元素的值printf("多项式ha :");PolynTraverse(ha, visit); printf("\n");printf("多项式hb :"); PolynTraverse(hb, visit); printf("\n");hc = MergeList(ha,hb); PolynTraverse(hc, visit); }。
数据结构C语言实现之一元多项式的表示及相加(2)
数据结构 C 语言实现之一元多项式的表示及相加(2)
一元多项式的表示及相加 对于符号多项式的各种操作,实际上都可以利用线性表来处理。比较典型的是关于一元多项式的处理。在
} } e>next; /*将 q 结点加入到和多项式中*/ q =q->next; } }
} if(p!=NULL)/*多项式 A 中还有剩余,则将剩余的结点加入到和多项式中*/
pre->next=p;
else /*否则,将 B 中的结点加入到和多项式中*/ pre->next=q; }
算法 2.24 多项式相加 假设 A 多项式有 M 项,B 多项式有 N 项,则上述算法的时间复杂度为 O(M+N) 图 2.20 所示为图 2.19 中两个多项式的和,其中孤立的结点代表被释放的结点。
通过对多项式加法的介绍,我们可以将其推广到实现两个多项式的相乘,因为乘法可以分解为一系列的加 法运算。
“中的结点无需另生成,则可看成是将多项式 B 加到多项式 A 中,由此得到下列运算规则(设 p、q 分别 指向多项式 A,B 的一项,比较结点的指数项)
若 p->exp< q->exp,则结点 p 所指的结点应 是“和多项式”中的一项,令指针 p 后移;若 p>exp>q->exp,则结点 q 所指的结点应是“和多项式”中的一项,将结点 q 插入在结点 p 之前, 且令指针 q 在原来的链表上后移;
(1)用单链表存储多项式的结点结构如下: struct Polynode { int coef; int exp; Polynode *next; } Polynode , * Polylist;
多项式相加c语言
reset(&p);
reset(&q);
reset(&sum);
return 0;
}
```
在上述代码中,首先定义了一个`Node`结构体,包含多项式的系数和指数,并通过链表的方式存储多项式的每一项。然后,实现了一系列函数,包括多项式的增加、输出、相加和消除。在`main`函数中,调用这些函数来完成多项式的输入、相加和输出。
请注意,这只是一个简单的示例,实际应用中可能需要考虑更多的边界情况和错误处理。
以下是一个简单的 C 语言示例,展示了如何实现多项式相加:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义结构的数据部分
struct poly {it zhishu;float xishu;
};
// 定义一个多项式结构
typedef struct node {
s->date.xishu = s->date.xishu + s->next->date.xishu;
s->next = s->next->next;
} else {
s = s->next;
}
}
d = d->next;
}
}
// 链表的消除函数
void reset(Node *pList) {
Node *p = pList;
while (p->next) {
if (flog == 1)
printf(" + ");
else {
☆C语言实验一(多项式求和)
1、参看书P48表3-3和二级考试软件的第三章单选第1题,验证字符变量赋字符B的六种不同常量表示方式:'B';66;0x42;0102;'\x42';'\102';参考参考调试程序:思考和和验证:1、如果char x=’B’改成char x=66; 或char x=0x42; 或char x=0102;或char x=’\x42’或char x=’\102’; 显示结果是什么?2、如果char x=’B’改为char x=128;则显示什么?数值129-255分别赋给x时,各显示什么?有什么规律可遵循?3、对于TC30 int y=32768;显示什么?赋值32768-65535各显示什么?有什么规律可遵循?4、验证用小写的书上P365关键字作“标识符(P39)”来代替上述主函数中变量x,会产生什么后果?用大写关键字作为标识符,编译(Compiling)会成功吗?5、按照P38-P39对C语言”标识符”的规定,用上述主函数验证江苏省高校计算机二级考试C语言考题练习软件中的第三章选择题第9,11,15、20题的正确标识符答案是什么?2、查阅ftp://219.219.96.234/基础部教学空间/江苏省高校计算机二级考试C语言考题练习软件“单选题”的正确答案第一章单选题(2、4、7、8、9、10);第三章部份关于标识符规定和数据定义的题目(9、11、15、20、22) 。
[要求]机械0822班在下周课上回答1-5 1-2、46-10 1-7、811-15 1-9、1016-20 3-9、1121-25 3-15、2226-32 3-12、221、阅读书45、48页关于整型常量、浮点型常量、字符型常量的表示方式,以及相应的变量声明方式。
用软件的第三章选择题第3、16题来验证之。
2、C语言算术表达式:阅读书54、书55、书56页C语言运算符及附录C“运算符及其结合性”(P365)用软件的第三章填空题第5、6、7、15、17、18、19、21题来验证之。
(C语言)加法运算实验报告
cout<<"两个多项式之和为:"<<endl;
cout<<"A+B=";
result(add(A,B));
cout<<endl;
return 0;
}
//当 p 不为空时进行循环;
{
PolyLink A,B;
A=Ini_polynode();
B=Ini_polynode();
cout<<"输入第一个多项式:"<<endl;
input(A);
cout<<"A=";
result(A);
cout<<"输入第二个多项式:"<<endl;
input(B);
cout<<"B=";
result(B);
2、 测试结果:
①输入 A=x+3x^6-8x^11
输入 B=6-3x^6+21x^9
输出 A+B=6+x+21x^9-8x^11
②输入 A=x+x^3
输入 B=-x-x^3
输出 A+B=0
③输入 A=x+x^100
输入 B=x^100+x^200
输出 A+B=x+2x^100+x^200
④输入 A=x+x^2+x^3
一元多项式的加法运算
一、 需求分析
1、 程序的基本功能 1 按照指数升序次序,输入并建立多项式 A 与 B。 2 计算多项式 A 与 B 的和,即建立多项式 A+B。 3 按照指数升序次序,输出多项式 A、B、A+B。 2、 输入输出要求: 1 输入多项式;
多项式加减法C++源码
《程序设计实践》课程实验报告学号:126040594姓名:王乾帅程序名称:多项式加法一:程序源码:#include<iostream>#include<string>using namespace std;int NUM=0;//全局变量,控制结构体下标,大小代表多项式的项数;int mt=0;struct Data //结构体,用来存放单个项的系数和幂,分别为x,y;{int x;int y;};Data Da[1000];bool cmp(Data a,Data b) //为了使用sort对结构体进行排序,自定义cmp函数;{return a.y>b.y;}void run(string &a); //自定义函数,用来对字符串进行处理,提取出字符串中的单个项;int main(){int i,stop,sig,sig2=0;string a,b;cout<<"多项式加减法运算器\n"<<"请输入需要选择的运算(1加法.2减法.)\n";cin>>sig;cout<<"请输入第一个多项式:";//多项式输入cin>>a;cout<<"请输入第二个多项式:";cin>>b;run(a);//处理多项式1,将数据存入结构体中;if(sig==2) mt=1;run(b);//处理多项式2;sort(Da,Da+NUM,cmp);//对结构体按照y(即单个项的幂)的大小排序for(i=0;i<NUM;)//以下为输出部分{stop=i+1;//搜索幂相同的结构体,将x相加,在进行各种判断,进而输出while(Da[i].y==Da[stop].y&&stop<NUM+1){stop++;}if(stop-i-1==0) //只搜索到一项的输出{if(Da[i].y==0){//判断输出是否为第一项,判断输出为正数还是负数,分别进行输出;if(Da[i].x>0&&i!=0&&sig2==1) {cout<<"+"<<Da[i].x;sig2=1;}if(Da[i].x>0&&i!=0&&sig2!=1) {cout<<Da[i].x;sig2=1;}if(Da[i].x>0&&i==0) {cout<<Da[i].x;sig2=1;}if(Da[i].x<0) {cout<<Da[i].x;sig2=1;}}else if(Da[i].y==1){if(Da[i].x>1&&i!=0&&sig2==1) {cout<<"+"<<Da[i].x;sig2=1;cout<<"x";}if(Da[i].x>1&&i!=0&&sig2!=1) {cout<<Da[i].x;sig2=1;cout<<"x";}if(Da[i].x>1&&i==0) {cout<<Da[i].x;sig2=1;cout<<"x";}if(Da[i].x==1&&i!=0&&sig2==1) {cout<<"+";sig2=1;cout<<"x";}if(Da[i].x==1&&i!=0&&sig2!=1) {sig2=1;cout<<"x";}if(Da[i].x==1&&i==0) {sig2=1;cout<<"x";}if(Da[i].x<-1) {cout<<Da[i].x;sig2=1;cout<<"x";}if(Da[i].x==-1) {cout<<"-";sig2=1;cout<<"x";}}else //搜索到多个项的输出{if(Da[i].x>1&&i!=0&&sig2==1) {cout<<"+"<<Da[i].x<<"x^"<<Da[i].y;sig2=1;}if(Da[i].x>1&&i!=0&&sig2!=1) {cout<<Da[i].x<<"x^"<<Da[i].y;sig2=1;}if(Da[i].x>1&&i==0) {cout<<Da[i].x<<"x^"<<Da[i].y;sig2=1;}if(Da[i].x==1&&i!=0&&sig2==1) {cout<<"+"<<"x^"<<Da[i].y;sig2=1;}if(Da[i].x==1&&i!=0&&sig2!=1) {cout<<"x^"<<Da[i].y;sig2=1;}if(Da[i].x==1&&i==0) {cout<<"x^"<<Da[i].y;sig2=1;}if(Da[i].x<-1) {cout<<Da[i].x<<"x^"<<Da[i].y;sig2=1;}if(Da[i].x==-1) {cout<<"-"<<"x^"<<Da[i].y;sig2=1;}}}else{int sum=0,j;for(j=i;j<stop;j++){sum+=Da[j].x;}if(Da[i].y==0){//判断输出是否为第一项,判断输出为正数还是负数,分别进行输出;if(sum>0&&i!=0&&sig2==1) {cout<<"+"<<sum;sig2=1;}if(sum>0&&i!=0&&sig2!=1) {cout<<sum;sig2=1;}if(sum>0&&i==0) {cout<<sum;sig2=1;}if(sum<0) {cout<<sum;sig2=1;}}else if(Da[i].y==1){if(sum>1&&i!=0&&sig2==1) {cout<<"+"<<sum<<"x";sig2=1;}if(sum>1&&i!=0&&sig2!=1) {cout<<sum<<"x";sig2=1;}if(sum>1&&i==0) {cout<<sum<<"x";sig2=1;}if(sum==1&&i!=0&&sig2==1) {cout<<"+"<<"x";sig2=1;}if(sum==1&&i!=0&&sig2!=1) {cout<<"x";sig2=1;}if(sum==1&&i==0) {cout<<"x";sig2=1;}if(sum<-1) {cout<<sum<<"x";sig2=1;}if(sum==-1) {cout<<"-"<<"x";sig2=1;}}else{if(sum>1&&i!=0&&sig2==1) {cout<<"+"<<sum<<"x^"<<Da[i].y;sig2=1;}if(sum>1&&i!=0&&sig2!=1) {cout<<sum<<"x^"<<Da[i].y;sig2=1;}if(sum>1&&i==0) {cout<<sum<<"x^"<<Da[i].y;sig2=1;}if(sum==1&&i!=0&&sig2==1) {cout<<"+"<<"x^"<<Da[i].y;sig2=1;}if(sum==1&&i!=0&&sig2!=1) {cout<<"x^"<<Da[i].y;sig2=1;}if(sum==1&&i==0) {cout<<"x^"<<Da[i].y;sig2=1;}if(sum<-1) {cout<<sum<<"x^"<<Da[i].y;sig2=1;}if(sum==-1) {cout<<"-"<<"x^"<<Da[i].y;sig2=1;}}}i=stop;}if(sig2==0) cout<<"0";cout<<endl;return 0;}void run(string &a) //自定义函数的函数体{int b[100],i,j;int sum1,sum2;for(i=0;i<a.length();i++){if(a[i]=='x') //以X为关键字进行搜索带有X的项{sum1=1;int k=i;int w=0;if(a[i-1]=='-') sum1=-1;if(a[k-1]>='0'&&a[k-1]<='9'){sum1=0;while(a[k-1]>='0'&&a[k-1]<='9')//将字符串转化为数字{w++;b[w]=a[k-1]-'0';k--;}for(j=w;j>=1;j--){sum1=sum1*10+b[j];}if(a[k-1]=='-') sum1=0-sum1;}sum2=1;if(a[i+1]=='^'){sum2=0;k=i;w=0;while(a[k+2]>='0'&&a[k+2]<='9'){w++;b[w]=a[k+2]-'0';k++;}for(j=1;j<=w;j++){sum2=sum2*10+b[j];}}if(mt==1){Da[NUM].x=-sum1;Da[NUM].y=sum2;}else{Da[NUM].x=sum1;Da[NUM].y=sum2;}NUM++;}}for(i=0;i<a.length();) //搜索不含X的单个数字项{int sum3=0,stop,k;if(a[i]>='0'&&a[i]<='9'){k=i;while(a[k]>='0'&&a[k]<='9'&&k<=a.length()){k++;}if(k==a.length()&&i==0) //输入仅有一个数字{stop=k;for(j=i;j<stop;j++){sum3=sum3*10+(a[j]-'0');}i=stop+1;}if((a[k]=='+'||a[k]=='-')&&i==0) //输入有一个数字并且在在字符串开头{stop=k;for(j=i;j<stop;j++){sum3=sum3*10+(a[j]-'0');}i=stop+1;}if((a[i-1]=='+'||a[i-1]=='-')&&k==a.length()) //输入有一个数字并且在在字符串结尾{stop=k;for(j=i;j<stop;j++){sum3=sum3*10+(a[j]-'0');}if(a[i-1]=='-') sum3=-sum3;i=stop+1;}if((a[k]=='+'||a[k]=='-')&&(a[i-1]=='+'||a[i-1]=='-')) //输入有一个数字并且在在字符串中央{stop=k;for(j=i;j<stop;j++){sum3=sum3*10+(a[j]-'0');}if(a[i-1]=='-') sum3=-sum3;i=stop+1;}else i++;}else i++;if(sum3!=0){if(mt==1){Da[NUM].x=-sum3;Da[NUM].y=0;}else{Da[NUM].x=sum3;Da[NUM].y=0;}NUM++;}}}二:程序测试1.2.3. 4. 5. 6. 7.8.三:编程过程中注意事项:输入:1.注意紧含数字时的处理(数字在开头,中间,结尾)输出:1.注意系数为1,-1的情况2.注意次数为1,为0的情况3.注意输出开头不能有+4.注意若为0,则不输出,除非仅仅输出出一个0.。
多项式相加c语言程序
#include "stdafx.h"//备注:我用的编译平台所提供的头文件不是“stdio.h"#include"malloc.h"#include<cstdlib> //此头文件用来解决执行可以执行文件exe后直接退出的问题,希望可以帮到大家了解一个新函数和头文件typedef struct List{ //定义一个动态链表float coef;int expn;struct List *next;}*list;list initlist()//初始化,生成新结点{list l;l=(list)malloc(sizeof(List));if (!l) printf("error");l->next=NULL;return l;}void insertlist (list l,float *coe,int *exp)//每次scanf后插入结点,从链尾插入,main函数中定义一个链表尾指针{list s;s=(list)malloc(sizeof(List));if(!s)printf("error");s->coef=*coe;s->expn=*exp;l->next =s;s->next =NULL;}void putout(list l)//输出链表{list p;p=l->next;while(p->next){ if(p->expn==0)printf("1+");else if(p->coef==1&&p->expn==1){printf("x+");}elseprintf("%.2fx^%d+",p->coef,p->expn);p=p->next ;} if(p->expn==0)printf("1\n");else if(p->coef==1&&p->expn==1){printf("x\n");}elseprintf("%.2fx^%d\n",p->coef,p->expn);}int cmp(int f,int g) //比较函数,用来判定当前两多项式指数问题{if (f<g)return (-1);else if(f==g)return 0;elsereturn (1);}void addlist(list n,list m){//多项式相加list hn,hm,pn,pm;float sum;pn=n->next ;pm=m->next ;hn=n;hm=m;//定义一个当前节点的指针和一个头指针while(hn->next&&hm->next){switch (cmp(pn->expn,pm->expn))//比较两指数{case -1:hn=pn;pn=pn->next;break;case 0:sum=pn->coef +pm->coef ;if(sum!=0){pn->coef =sum;pm=pm->next ;free(hm->next);hm->next =pm;hn=hn->next ;pn=pn->next ;}//ifelse {hn->next =pn->next ;free(pn);pn=hn->next ;hm->next =pm->next ;free(pm);pm=hm->next ;}break;//elsecase 1:hm->next =pm->next ;hn->next=pm;pm->next =pn;hn=pm;pn=pn->next ;pm=hm->next ;break;}//switch}//whileif(hm->next ) //参考书本43页算法的思想,将剩余结点插入当前链表中{hn->next=pm;free(hm);}}//addlistvoid chongpaixu(list l)//将输入的多项式按升序排列,并将指数相同的合并(还不能执行){ list s;list q;list k;list w;float sum;k=initlist();q=l->next ;s=l;while(q->next){for(w=l ;q->next !=NULL;q=q->next ){for (s=s->next ;s->next!=NULL;s=s->next ){switch(cmp(s->expn,q->expn)){case -1:w=w->next ;break;case 1:k->coef=q->coef;q->coef=s->coef;s->coef=k->coef;k->expn=q->expn ;q->expn =s->expn ;s->expn =k->expn ;free(k);w=w->next ;break;case 0:sum=s->coef+q->coef;if(sum){s->coef=sum;s->next=q;free(q);q=s->next ;}//ifelse {w->next=q->next;free(s);free(q);s=w->next ;q=s->next ;}//elsebreak;}//switch}}}//while}void putmessage(void)//用来表明备注{printf("备注:该算法经过上课时老师给我们提出的问题进行了修改,不过关于排序的算法还不能完善\n");printf("因此,请输入时请将多项式按照升序输入,将相同指数合并!\n");printf("\n");printf("\n");printf("\n");printf("\n");printf("\n");printf("\n");}void main(){list l,s,hl,hs; int i,d,exp;float *q;int *w;float coe;putmessage();q=&coe;w=&exp;l=initlist();s=initlist();hl=l;hs=s;printf("请输入l的项数\n");scanf("%d",&d);if(d>0){for (i=0;i<d;i++){printf("请输入第%d项的系数\n",i+1);scanf("%f",&coe);printf("请输入第%d项的指数\n",i+1);scanf("%d",&exp);if(coe){insertlist(hl,q,w);hl=hl->next ;}}/*chongpaixu(l);*/if(l->next ){printf("你输入的多项式是f(x)=");putout(l);}else printf("你输入的多项式是f(x)=0\n"); }else printf("你输入的多项式l不存在\n");printf("请输入s的项数\n");scanf("%d",&d);if(d>0){for (i=0;i<d;i++){printf("请输入第%d项的系数\n",i+1);scanf("%f",&coe);printf("请输入第%d项的r指数\n",i+1);scanf("%d",&exp);if(coe){insertlist(hs,q,w);hs=hs->next ;}}if(s->next){printf("你输入的多项式是f(x)=");putout(s);}else printf("你输入的多项式是f(x)=0\n");}else printf("你输入的多项式不存在\n");hl=l;hs=s;if(hl->next &&hs->next ){addlist(l,s);printf("合并后的多项式f(x)=");if(l->next){putout(l);}else printf("0\n");}else printf("no add\n");system ( "pause" );//不加此语句,exe文件在执行完毕直接跳出}。
C(语言)程序设计实现多个多项式的加法、减法、乘法
实现多个多项式的加法、减法、乘法发表日期:2003年7月21日出处:mfcer@ 作者:精神病人已经有293位读者读过此文/** 文件名: 1_3.c(选做题)* 实验环境: Turbo C 2.0* 完成时间: 2003年2月22日*-------------------------------------------------------------------- * 改进说明: 可以实现多个多项式的加法、减法、乘法,并且比书中算法更加* 合理. 例如: 连加a+b+c+d,连减a-b-c-d,连乘a*b*c*d.*/#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <string.h>#define TRUE 1#define FALSE 0#define POSITIVE 1#define NEGATIVE -1typedef int status;typedef struct NodeType{float fCoeff;int iExpon;struct NodeType *next;} NodeType, *LinkType;typedef LinkType polynomial;typedef polynomial *PolyPointer;status MakePolyBuff(PolyPointer *, const int);status MakeNode(polynomial *, const float, const int);void AppNodeToList(polynomial *, polynomial); /* 在链表尾追加结点 */status CreatePolyn(PolyPointer, int);status ProcStrError(const char[]); /* 检查输入的数据 */void SortPolyn(PolyPointer, int); /* 根据iExpon域对链表进行升序排序 */void DestroyBuff(PolyPointer, const int);void DestroyPolyn(polynomial);int PolynLength(const polynomial); /* 求链表的长度 */void AddProcess(PolyPointer, const int, PolyPointer, const int); void SubstractProcess(PolyPointer, const int, PolyPointer);void MultiplyProcess(PolyPointer, const int, PolyPointer);void PrintPolyn(const polynomial);void MergePolynCoeff(PolyPointer, int); /* 在有序链表中,合并同类项 */int main(void){int iCounter,iPolyNum; /* 多项式链表缓冲区中链表的个数 */PolyPointer PolyBuff = NULL; /* 用户输入的多项式链表缓冲区 */polynomial PolyAddRes = NULL, /* 存放连加结果链表 */PolySubRes = NULL, /* 存放连减结果链表 */PolyMulRes = NULL; /* 存放连乘结果链表 */char strNum[10];do{printf("请输入需要构造多项式的个数,至少2个: ");gets(strNum);iPolyNum = atoi(strNum);} while (iPolyNum < 2);MakePolyBuff(&PolyBuff, iPolyNum);CreatePolyn(PolyBuff, iPolyNum);SortPolyn(PolyBuff, iPolyNum);MergePolynCoeff(PolyBuff, iPolyNum);printf("\n打印用户输入并整合后的多项式:\n");for (iCounter = 0; iCounter < iPolyNum; iCounter++){printf("第%d个项式:\n", iCounter + 1);PrintPolyn(*(PolyBuff + iCounter));}AddProcess(PolyBuff, iPolyNum, &PolyAddRes, POSITIVE);printf("\n----------------连加结果-----------------\n");PrintPolyn(PolyAddRes);SubstractProcess(PolyBuff, iPolyNum, &PolySubRes);printf("\n----------------连减结果-----------------\n");PrintPolyn(PolySubRes);MultiplyProcess(PolyBuff, iPolyNum, &PolyMulRes);printf("\n----------------连乘结果-----------------\n");PrintPolyn(PolyMulRes);printf("\n运行完毕!\n");/* 回收资源 */DestroyBuff(PolyBuff, iPolyNum);DestroyPolyn(PolyAddRes);DestroyPolyn(PolySubRes);DestroyPolyn(PolyMulRes);getch();return 0;}status MakePolyBuff(PolyPointer *polyBuffHead, const int iPolyNum) {int iCounter;*polyBuffHead = (PolyPointer)malloc(sizeof(polynomial) * iPolyNum);if (!(*polyBuffHead)){printf("错误,内存溢出!\n");return FALSE;}for (iCounter = 0; iCounter < iPolyNum; iCounter++)*(*polyBuffHead + iCounter) = NULL;return TRUE;}status CreatePolyn(PolyPointer PolyBuff, int iPolyNum){int iCounter, iExpon;float fCoeff;char strNum[100], strTemp[64], *cpCurr, *cpCurrNum;polynomial pNewNode = NULL, pInsPos = NULL;printf("\n请输入构造多项式的系数和指数...\n");printf("输入一个多项式的方式为: 系数, 指数; ... ; 系数, 指数;\n例如: 3, 4;5, 6; 7, 8;\n");for (iCounter = 0; iCounter < iPolyNum; iCounter++){printf("\n请输入第%d个多项式:\n", iCounter + 1);gets(strNum);if(!ProcStrError(strNum)) return FALSE;cpCurr = cpCurrNum = strNum;while (*cpCurr != '\0'){if (*cpCurr == ','){strncpy(strTemp, cpCurrNum, cpCurr - cpCurrNum);strTemp[cpCurr - cpCurrNum] = '\0';fCoeff = (float)atof(strTemp);cpCurrNum = cpCurr + 1;}else if (*cpCurr == ';'){strncpy(strTemp, cpCurrNum, cpCurr - cpCurrNum); strTemp[cpCurr - cpCurrNum] = '\0';iExpon = atoi(strTemp);MakeNode(&pNewNode, fCoeff, iExpon);AppNodeToList(PolyBuff + iCounter, pNewNode);cpCurrNum = cpCurr + 1;}cpCurr++;}}return TRUE;}status MakeNode(LinkType *pp, const float coeff, const int expon) {if (!(*pp = (LinkType)malloc(sizeof(NodeType) * 1))){printf("Error, the memory is overflow!\n");return FALSE;}(*pp)->fCoeff = coeff;(*pp)->iExpon = expon;(*pp)->next = NULL;return TRUE;}void AppNodeToList(polynomial *pHead, polynomial pNewNode){static polynomial pCurrNode;if (!(*pHead))(*pHead) = pCurrNode = pNewNode;else{pCurrNode->next = pNewNode;pCurrNode = pCurrNode->next;}}void SortPolyn(PolyPointer PolyBuff, int iPolyNum){int iCounter;polynomial pTemp, pTempCurrNode, /* 临时链表 */pPrevMinExp, pCurrMinExp,/* 指向最小iExpon结点的指针 */ pCurrNode, pPrevNode;for (iCounter = 0; iCounter < iPolyNum; iCounter++){pTemp = NULL;while (*(PolyBuff + iCounter) != NULL){pPrevNode = pPrevMinExp = pCurrMinExp =*(PolyBuff + iCounter);pCurrNode = (*(PolyBuff + iCounter))->next;while (pCurrNode != NULL){if (pCurrMinExp->iExpon > pCurrNode->iExpon){pPrevMinExp = pPrevNode;pCurrMinExp = pCurrNode;}pPrevNode = pCurrNode;pCurrNode = pCurrNode->next;}/* 将系数最小的结点从原链表中取出 */if (pCurrMinExp == *(PolyBuff + iCounter))*(PolyBuff + iCounter) = pPrevMinExp->next;elsepPrevMinExp->next = pCurrMinExp->next;/* 将系数最小的结点插入升序链表 */pCurrMinExp->next = NULL;if (!pTemp)pTemp = pTempCurrNode = pCurrMinExp;else{pTempCurrNode->next = pCurrMinExp;pTempCurrNode = pTempCurrNode->next;}}*(PolyBuff + iCounter) = pTemp;}}void MergePolynCoeff(PolyPointer PolyBuff, int iPolyNum){int iCounter;float MergeCoeffRes = 0;polynomial TempList, ResList = NULL, pCurrNode, pPreNode,pNewNode = NULL;for (iCounter = 0; iCounter < iPolyNum; iCounter++){pPreNode = TempList= *(PolyBuff + iCounter);MergeCoeffRes = pPreNode->fCoeff;pCurrNode = (*(PolyBuff + iCounter))->next;while (pCurrNode != NULL){while ((pCurrNode != NULL) &&(pCurrNode->iExpon == pPreNode->iExpon)){MergeCoeffRes += pCurrNode->fCoeff;pPreNode = pCurrNode;pCurrNode = pCurrNode->next;}/* 在ResList中加入新结点 */if (MergeCoeffRes != 0){MakeNode(&pNewNode, MergeCoeffRes, pPreNode->iExpon); AppNodeToList(&ResList, pNewNode);MergeCoeffRes = 0;}pPreNode = pCurrNode;}DestroyPolyn(TempList);*(PolyBuff + iCounter) = ResList;ResList = NULL;}}void AddProcess(PolyPointer polyBuff, const int iPolyNum,PolyPointer pResult, const int iSign){int iCounter;float fCoeffRes;polynomial pNewNode, pCurrNode_1, pCurrNode_2,pDelList = NULL, /* 下次要删除的中间结果链表 */pResList = NULL; /* 中间结果链表 */pCurrNode_1 = *(polyBuff);for (iCounter = 1; iCounter < iPolyNum; iCounter++){pCurrNode_2 = *(polyBuff + iCounter);while (pCurrNode_1 != NULL && pCurrNode_2 != NULL){if (pCurrNode_1->iExpon == pCurrNode_2->iExpon){fCoeffRes = 0;fCoeffRes = pCurrNode_1->fCoeff +iSign * pCurrNode_2->fCoeff;if (fCoeffRes != 0){MakeNode(&pNewNode, fCoeffRes,pCurrNode_1->iExpon);AppNodeToList(&pResList, pNewNode);}pCurrNode_1 = pCurrNode_1->next;pCurrNode_2 = pCurrNode_2->next;}else if (pCurrNode_1->iExpon < pCurrNode_2->iExpon) {MakeNode(&pNewNode, pCurrNode_1->fCoeff,pCurrNode_1->iExpon);AppNodeToList(&pResList, pNewNode);pCurrNode_1 = pCurrNode_1->next;}else /* 当pCurrNode_1->iExpon > pCurrNode_2->iExpon时候 */{MakeNode(&pNewNode, iSign * pCurrNode_2->fCoeff,pCurrNode_2->iExpon);AppNodeToList(&pResList, pNewNode);pCurrNode_2 = pCurrNode_2->next;}}/* 加入余下的多项式 */while (pCurrNode_1 != NULL){MakeNode(&pNewNode, pCurrNode_1->fCoeff,pCurrNode_1->iExpon);AppNodeToList(&pResList, pNewNode);pCurrNode_1 = pCurrNode_1->next;}while (pCurrNode_2 != NULL){MakeNode(&pNewNode, iSign * pCurrNode_2->fCoeff,pCurrNode_2->iExpon);AppNodeToList(&pResList, pNewNode);pCurrNode_2 = pCurrNode_2->next;}if (pDelList != NULL) DestroyPolyn(pDelList);pCurrNode_1 = pResList;pDelList = pResList;pResList = NULL;}*pResult = pCurrNode_1;}void SubstractProcess(PolyPointer polyBuff, const int iPolyNum,PolyPointer pResult){AddProcess(polyBuff, iPolyNum, pResult , NEGATIVE);}void MultiplyProcess(PolyPointer polyBuff, const int iPolyNum,PolyPointer pResult){int iCounter = 1, jCounter = 0, iLength; /* 缓冲区的长度 */PolyPointer pTempBuff = NULL; /* 存放中间结果的缓冲区 */polynomial pCurrNode_1, pCurrNode_2, pNewNode = NULL;/* 初始化 */pCurrNode_1 = polyBuff[0];iLength = PolynLength(polyBuff[0]);MakePolyBuff(&pTempBuff, iLength);while (TRUE){while (pCurrNode_1 != NULL){pCurrNode_2 = polyBuff[iCounter];while (pCurrNode_2 != NULL){MakeNode(&pNewNode,pCurrNode_1->fCoeff * pCurrNode_2->fCoeff, pCurrNode_1->iExpon + pCurrNode_2->iExpon); AppNodeToList(&pTempBuff[jCounter], pNewNode);pCurrNode_2 = pCurrNode_2->next;}jCounter++;pCurrNode_1 = pCurrNode_1->next;}/* 回收旧的中间结果 */if (pResult != NULL) DestroyPolyn(*pResult);/* 获得新的中间结果 */AddProcess(pTempBuff, iLength, pResult , POSITIVE);DestroyBuff(pTempBuff, iLength); /* 回收存中间结果的缓冲区 */jCounter = 0;if (++iCounter >= iPolyNum)break;else{iLength = PolynLength(*pResult);MakePolyBuff(&pTempBuff, iLength);pCurrNode_1 = *pResult;}}}void PrintPolyn(const polynomial polyList){polynomial pCurrNode = polyList;printf("多项式的长度为: %d\n", PolynLength(polyList));while (pCurrNode != NULL){printf("%.2fX^%d", pCurrNode->fCoeff, pCurrNode->iExpon); if (pCurrNode->next != NULL)if (pCurrNode->next->fCoeff > 0 )printf("+");pCurrNode = pCurrNode->next;}printf("\n");}int PolynLength(const polynomial polyList){int iLength = 0;polynomial pCurrNode = polyList;while (pCurrNode != NULL){pCurrNode = pCurrNode->next;iLength++;}return iLength;}void DestroyBuff(PolyPointer polyBuff, const int iPolyNum){int iCounter;for (iCounter = 0; iCounter < iPolyNum; iCounter++)DestroyPolyn(polyBuff[iCounter]);free(polyBuff);}void DestroyPolyn(polynomial polyList){polynomial pCurrNode;while (polyList != NULL){pCurrNode = polyList;polyList = polyList->next;free(pCurrNode);}}status ProcStrError(const char str[]){const char *cpCurr = str;if (!strlen(str)){printf("你没有输入数据!\n");return FALSE;}while (*cpCurr != '\0'){if (!(*cpCurr == ' ' || *cpCurr == ',' || *cpCurr == ';' || *cpCurr == '-')&& ('0' > *cpCurr || *cpCurr > '9')|| (*(cpCurr + 1) == '\0' && *cpCurr != ';')){printf("输入数据出错,请注意正确的输入方式!\n");return FALSE;}cpCurr++;}return TRUE;}。
C语言多项式加法
C语言题目-多项式加法多项式加法(10分)题目内容:一个多项式可以表达为x的各次幂与系数乘积的和,比如:2x6+3x5+12x3+6x+20现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。
程序要处理的幂最大为100。
输入格式:总共要输入两个多项式,每个多项式的输入格式如下:每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,所有的系数都是整数。
第一行一定是最高幂,最后一行一定是0次幂。
注意第一行和最后一行之间不一定按照幂次降低顺序排列;如果某个幂次的系数为0,就不出现在输入数据中了;0次幂的系数为0时还是会出现在输入数据中。
输出格式:从最高幂开始依次降到0幂,如:2x6+3x5+12x3-6x+20注意其中的x是小写字母x,而且所有的符号之间都没有空格,如果某个幂的系数为0则不需要有那项。
输入样例:6 25 33 121 60 206 25 32 121 60 20输出样例:4x6+6x5+12x3+12x2+12x+40时间限制:500ms内存限制:32000kb代码#include <stdio.h> //此程序需要分3种情况,一、幂为0;二、幂为1;三、幂大于1int a[105],b[105];int main(){intx,y;while (~scanf("%d%d",&x,&y)){//存储第一个多项式的数据,当幂为0时停止输入a[x]=y;if (x==0) break;}while (~scanf("%d%d",&x,&y)){//存储第二个多项式的数据,当幂为0时停止输入b[x]=y;if (x==0) break;}for (int i=0;i<=100;i++)a[i]=a[i]+b[i]; //将两个多项式的系数相加保存到数组a[i]中int flag=0; //用此数来区分输出的式子是否是第一个数字,是第一个式子flag就为0,不是第一个式子flag就为1for (int i=20;i>1;i--){if (a[i]){ //系数不为0if (a[i]>0){ //系数大于0的情况if (a[i]==1){ //系数等于1的情况if (flag==0){//输出的式子是第一个式子printf("x%d",i);flag=1;}else printf("+x%d",i); //输出的式子不是第一个式子}else{ //系数大于1的情况if (flag==0){printf("%dx%d",a[i],i);flag=1;}elseprintf("+%dx%d",a[i],i);}}else{ //系数小于0的情况if (a[i]==-1)printf("-x%d",i);elseprintf("%dx%d",a[i],i);}}}if (a[1]){if (a[1]>0){if (a[1]==1){if (flag==0){printf("x");flag=1;} elseprintf("+x");}else{if (flag==0){printf("%dx",a[1]); flag=1;} elseprintf("+%dx",a[1]);}}else{if (a[1]==-1)printf("-x");elseprintf("%dx",a[1]);}}if (a[0]>0){if (flag==0){printf("%d",a[0]);flag=1;}elseprintf("+%d",a[0]);}if (a[0]<=0){printf("%d",a[0]);}printf("\n");return 0;}【下载本文档,可以自由复制内容或自由编辑修改内容,更多精彩文章,期待你的好评和关注,我将一如既往为您服务】。
C++链表实现多项式加法乘法
#include<iostream>using namespace std;class Term{public:float coef;//系数int expn;//指数Term *next;};class Poly{public:Poly()//构造{L=new Term;L->next=NULL;}Poly(const Poly&);//复制~Poly()//析构{Term *p;while(L){p=L->next;delete L;L=p;}}void createpoly();void displaypoly();int getlen();friend void addpoly(Poly&,Poly&);void mulpoly(Poly&,Term*);void multiplypoly(Poly&,Poly&);private:Term *L;};Poly::Poly(const Poly &p1)//深复制{L=new Term;Term *p=L,*r=p1.L->next;while(r){p->next=new Term;p->next->coef=r->coef;p->next->expn=r->expn;p=p->next;r=r->next;}p->next=NULL;}int Poly::getlen()//多项式长度{Term *p=L->next;int len=0;while(p){len++;p=p->next;}return len;}void Poly::createpoly()//输入规则:项数//系数1 指数1 系数2 指数2 ...{Term *p=L,*q;int n;cout<<"Please input quantity of terms:"<<endl;cin>>n;cout<<"Please input the Polynomial:"<<endl;for(int i=0;i<n;i++){q=new Term;cin>>q->coef;cin>>q->expn;p->next=q;p=q;}p->next=NULL;}void Poly::displaypoly(){Term *p=L->next;cout<<"The Polynomial is:"<<endl;if(!p) return;while(p->next!=NULL){if(p->expn==0){cout<<p->coef;if(p->next->coef>=0) cout<<'+';}else{cout<<p->coef<<"X^"<<p->expn;if(p->next->coef>=0) cout<<'+';}p=p->next;}cout<<p->coef<<"X^"<<p->expn<<endl;}void addpoly(Poly &p1,Poly &p2)//多项式求和{Term *ha=p1.L,*hb=p2.L;Term *pa=ha->next,*pb=hb->next;while(pa&&pb){if(pa->expn<pb->expn){ha=pa;pa=pa->next;}else if(pa->expn>pb->expn){ha->next=pb;hb->next=pb->next;pb->next=pa;pb=hb->next;ha=ha->next;}else//相等{if(pa->coef+pb->coef!=0.0)//系数不为0{pa->coef=pa->coef+pb->coef;ha=pa;}else{ha->next=pa->next;delete pa;}hb->next=pb->next;delete pb;pa=ha->next;pb=hb->next;}}if(pb) ha->next=pb;//若pb不为空,则将剩余接到ha后面delete hb;}//C(X)=A(X)*B(X)//=A(X)*[b1X^e1+b2X^e2...+bnX^en]//=(sigma i=1~n)biA(X)X^eivoid Poly::mulpoly(Poly &po1,Term *p2)//对A(x)进行系数加权{Term *p1=po1.L->next,*p=L;while(p1){p->next=new Term;p->next->coef=p1->coef*p2->coef;p->next->expn=p1->expn+p2->expn;p=p->next;p1=p1->next;}p->next=NULL;}void Poly::multiplypoly(Poly &po1,Poly &po2)//将多项式乘法分解为一系列加法运算{Poly poi;Term *p2=po2.L->next;while(p2){poi.mulpoly(po1,p2);addpoly((*this),poi);poi.L=new Term;poi.L->next=NULL;p2=p2->next;}}int main(){Poly p1,p2,p3,p4,p5;cout<<"********** ADD **********"<<endl;p1.createpoly();p1.displaypoly();p2.createpoly();p2.displaypoly();cout<<"P1+P2: ";addpoly(p1,p2);p1.displaypoly();cout<<"********** MUTIPLY **********"<<endl;p3.createpoly();p3.displaypoly();p4.createpoly();p4.displaypoly();cout<<"P1*P2: ";p5.multiplypoly(p3,p4);p5.displaypoly();return 0;}。
多项式的加法和乘法计算c语言代码
多项式的加法和乘法计算C语言代码多项式是代数学中常见的一种数学表达式形式,通常表示为:P(x) = a0 + a1*x + a2*x^2 + a3*x^3 + ... + an*x^n其中a0, a1, a2,...,an是多项式P(x)的系数,x是变量,n是多项式的次数。
在实际的编程开发中,我们经常需要实现多项式的加法和乘法计算。
下面我们将介绍如何使用C语言来实现多项式的加法和乘法计算。
一、多项式的表示与存储在C语言中,可以使用结构体来表示多项式,并使用数组来存储多项式的系数。
假设我们要表示一个最高次数为n的多项式,可以定义结构体如下:```ctypedef struct {int coeff[MAX_SIZE]; // 存储多项式系数的数组int degree; // 多项式的最高次数} Polynomial;其中MAX_SIZE是一个常数,用来表示多项式的最大阶数。
在实际使用中,可以根据需要进行调整。
二、多项式的加法多项式的加法实质上是将两个多项式的对应系数相加,并将结果存储在一个新的多项式中。
下面是多项式加法的C语言代码实现:```cPolynomial addPolynomial(Polynomial poly1, Polynomial poly2) {Polynomial result;int i;// 确定结果多项式的最高次数result.degree = (poly1.degree > poly2.degree) ?poly1.degree : poly2.degree;// 将对应系数相加for (i = 0; i <= result.degree; i++) {result.coeff[i] = poly1.coeff[i] + poly2.coeff[i];return result;}```以上代码通过遍历多项式的系数数组,将对应位置的系数相加,并将结果存储在result中。
多项式相加(含运行结果截图)
printf("指数:%d系数:%f\n",r->expn,r->coef);
r=r->next;
}
}
main()
{
void creatpolyn(struct linklist *p,int n); //输入n项的系数,建立一个链表
struct linklist * addpolyn(struct linklist*p,struct linklist*q); //两个多项式相加,返回结果指针
la->coef=s; //此项不为0需要修改la中当前节点的系数值
la=la->next;
p=p->next;
lb=lb->next;
q=q->next;
}
else {
p->next=la->next;
r=la;
la=la->next;
free(r);
lb=lb->next;
q=q->next;
}
scanf("%d",&n);
creatpolyn(p,n);
printf("请输入第二个多项式的项数:\n");
scanf("%d",&n);
creatpolyn(q,n);
r=addpolyn(p,q);
print(r);
}
四.算法分析
多项式由系数和指数组成,建立两个链表分别存储系数和指数。为了方便实验过程,实验在输入的时候按照指数的由低到高输入,避免了排序。在相加过程中,将两个链表从头到尾进行比较,直到比到一个链表没有元素为止,将其中指数相同的系数进行加减运算。最后打印出多项式。
小白专场-多项式乘法与加法运算-c语言实现
⼩⽩专场-多项式乘法与加法运算-c语⾔实现⽬录数据结构与算法_Python_C完整教程⽬录:⼀、题意理解设计函数分别求两个⼀元多项式的乘积与和,例:\[\text{已知以下两个多项式:} \\ \begin{align} & 3x^4-5x^2+6x-2 \\ & 5x^{20}-7x^4+3x \end{align} \]\[\text{多项式和为:} \\ \begin{align} 5x^{20}-4x^4-5x^2+9x-2 \end{align} \]假设多项式的乘积为\((a+b)(c+d)=ac+ad+bc+bd\),则多项式的乘积如下:\[\begin{align} 15x^{24}-25x^{22}+30x^{21}-10x^{20}-21x^8+35x^6-33x^5+14x^4-15x^3+18x^2-6x \end{align} \]通过上述题意理解,我们可以设计函数分别求两个⼀元多项式的乘积与和。
输⼊样例:\[\begin{align} & 3x^4-5x^2+6x-2 \quad --> \quad \text{4个}\,3\,4\,-5\,2\,6\,1\,-2\,0 \\ & 5x^{20}-7x^4+3x \quad --> \quad \text{3个}\,5\,20\,-7\,4\,3\,1 \\ \end{align} \\ \]输出样例:\[\begin{align} & 15x^{24}-25x^{22}+30x^{21}-10x^{20}-21x^8+35x^6-33x^5+14x^4-15x^3+18x^2-6x \\ & 15 \, 24 \, -25 \, 22 \, 30 \, 21 \, -10 \, 20 \, -21 \, 8 \, 35 \, 6 \, -33 \, 5 \, 14 \, 4 \, -15 \, 3 \, 18 \, 2 \, -6 \, 1 \, 5 \, 20 \, -4 \, 4 \, -5 \, 2 \, 9 \, 1 \, -2 \, 0 \end{align} \]⼆、求解思路多项式表⽰程序框架读多项式加法实现乘法实现多项式输出三、多项式的表⽰仅表⽰⾮零项3.1 数组优点:编程简单、调试简单缺点:需要事先确定数组⼤⼩⼀种⽐较好的实现⽅法是:动态数组(动态更改数组的⼤⼩)3.2 链表优点:动态性强缺点:编程略为复杂、调试⽐较困难数据结构设计:/* c语⾔实现 */typedef struct PolyNode *Polynomial;struct PolyNode{int coef;int expon;Polynomial link;}四、程序框架搭建/* c语⾔实现 */int main(){读⼊多项式1;读⼊多项式2;乘法运算并输出;加法运算并输出;return 0;}int main(){Polynomial P1, P2, PP, PS;P1 = ReadPoly();P2 = ReadPoly();PP = Mult(P1, P2);PrintPoly(PP);PS = Add(P1, P2);PrintPoly(PS);return 0;}需要设计的函数:读⼀个多项式两多项式相乘两多项式相加多项式输出五、如何读⼊多项式/* c语⾔实现 */Polynomial ReadPoly(){...;scanf("%d", &N);...;while (N--) {scanf("%d %d", &c, &e);Attach(c, e, &Rear);}...;return P;}Rear初值是多少?两种处理⽅法:Rear初值为NULL:在Attach函数中根据Rear是否为NULL做不同处理Rear指向⼀个空结点/* c语⾔实现 */void Attach(int c, int e, Polynomial *pRear){Polynomial P;P = (Polynomial)malloc(sizeof(struct PolyNode));p->coef = c; /* 对新结点赋值 */p->expon = e;p->link = NULL;(*pRear)->link = P;(*pRear) = P; /* 修改pRear值 *//* c语⾔实现 */Polynomial ReadPoly(){Polynomial P, Rear, t;int c, e, N;scanf("%d", &N);P = (Polynomial)malloc(sizeof(struct PolyNode)); // 链表头空结点 P->link = NULL;Rear = P;while (N--) {scanf("%d %d", &c, &e);Attach(c, e, &Rear); // 将当前项插⼊多项式尾部}t = P; P = P->link; free(t); // 删除临时⽣成的头结点return P;}六、如何将两个多项式相加/* c语⾔实现 */Polynomial Add(Polynomial P1, Polynomial P2){...;t1 = P1; t2 = P2;P = (Polynomial)malloc(sizeof(struct PolyNode));P->link = NULL;Rear = P;while (t1 && t2){if (t1->expon == t2->expon){...;}else if (t1->expon > t2->expon){...;}else{...;}}while (t1){...;}while (t2){...;}...;return P;}七、如何将两个多项式相乘⽅法:将乘法运算转换为加法运算将P1当前项(ci, ei)乘P2多项式,再加到结果多项式⾥/* c语⾔实现 */t1 = P1; t2 = P2;P = (Polynomial)malloc(sizeof(struct PolyNode)); P->link = NULL;Rear = P;while (t2){Attach(t1->coef * t2->coef, t1->expon + t2->expon, &Rear);t2 = t2->link;}逐项插⼊将P1当前项(c1_i, e1_i)乘P2当前项(c2_i, e2_i),并插⼊到结果多项式中。
多项式相加的函数(数据结构_C语言版)
多项式相加的函数(数据结构_C语言版)一、编写一个程序用单链表存储多项式,并实现两个多项式相加的函数。
【源程序】#include#include#define MAX 20typedef struct{ float coef;int exp;}PolyArray[MAX];typedef struct pnode{ float coef;//系数int exp;//指数struct pnode *next;}PolyNode;void DispPoly(PolyNode *L)//输出多项式{ PolyNode *p=L->next;while(p!=NULL){ printf("%gx^%d",p->coef,p->exp);p=p->next;}printf("\n");}void CreateListR(PolyNode *&L,PolyArray a,int n)//尾插法建立单链表{ PolyNode *s,*r;int i;L=(PolyNode *)malloc(sizeof(PolyNode)); //创建头结点L->next=NULL;r=L; //r始终指向终端结点,开始时指向头结点for (i=0;i<n;i++)< p="">{s=(PolyNode *)malloc(sizeof(PolyNode));//创建新结点s->coef=a[i].coef;s->exp=a[i].exp;r->next=s; //将*s插入*r之后r=s;}r->next=NULL;}void Sort(PolyNode *&head)//按exp域递减排序{ PolyNode *p=head->next,*q,*r;if(p!=NULL){ r=p->next;p->next=NULL;p=r;while(p!=NULL){ r=p->next;q=head;while(q->next!=NULL&&q->next->exp>p->exp)q=q->next;p->next=q->next;q->next=p;p=r;}}}void Add(PolyNode *ha,PolyNode *hb,PolyNode *&hc)//求两个有序集合的并{PolyNode *pa=ha->next,*pb=hb->next,*s,*tc;float c;hc=(PolyNode *)malloc(sizeof(PolyNode));tc=hc;while(pa!=NULL&&pb!=NULL){ if(pa->exp>pb->exp){ s=(PolyNode *)malloc(sizeof(PolyNode)); //复制结点s->exp=pa->exp;s->coef=pa->coef;tc->next=s;tc=s;pa=pa->next;}else if(pa->expexp){ s=(PolyNode *)malloc(sizeof(PolyNode)); //复制结点s->exp=pb->exp;s->coef=pb->coef;tc->next=s;tc=s;pb=pb->next;}else{ c=pa->coef+pb->coef;if(c!=0)//系数之和不为0事创建新结点{ s=(PolyNode *)malloc(sizeof(PolyNode));s->exp=pa->exp;s->coef=c;tc->next=s;tc=s;}pa=pa->next;pb=pb->next;}}if(pb!=NULL)pa=pb;//复制余下的结点while(pa!=NULL){ s=(PolyNode *)malloc(sizeof(PolyNode)); //复制结点s->exp=pa->exp;s->coef=pa->coef;tc->next=s;tc=s;pa=pa->next;}tc->next=NULL;}void main(){PolyNode *ha,*hb,*hc;PolyArray a={{1.5,0},{2.5,1},{3.3,3},{-2.5,5}};PolyArray b={{-1.5,0},{2.5,1},{3.7,3},{-2.5,5},{5.6,7}};CreateListR(ha,a,4);CreateListR(hb,b,5);printf("原多项式A为:");DispPoly(ha);printf("原多项式B为:");DispPoly(hb);Sort(ha);Sort(hb);printf("有序多项式A:");DispPoly(ha);printf("有序多项式B:");DispPoly(hb);Add(ha,ha,hc);printf("多项式相加结果:");DispPoly(hc); printf("\n");}</n;i++)<>。
C语言 多项式的加减
多项式的加减详细设计#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct term{ //多项式结点的定义float coef; //系数int exp; //指数struct term *link; //链接指针}*Poly;void Input(Poly &pl) //输入多项式{term *nterm,*p,*pre;float c;int e;pl=new term; //pl为头指针pl->link=NULL;printf("***当输入指数<0时结束,且不进入运算***\n");while(1){printf("请输入系数和指数\n");scanf("%f%d",&c,&e);if(e<0)break; //循环结束条件nterm=new term; //开辟新结点if(!nterm) //验证是否开辟到{printf("error");exit(1);}nterm->coef=c;nterm->exp=e;nterm->link=NULL;int g=0;pre=pl;if(pl->link==NULL) //加入第一个结点pl->link=nterm;else //加入第二及以后的结点{p=pre->link;while(g==0){if( p->exp<nterm->exp){if(p->link==NULL){p->link=nterm;g=1;}else{pre=p;p=pre->link;}//向后推进}elseif( p->exp>nterm->exp){nterm->link=p;pre->link=nterm;g=1;}else //指数相等的项的系数相加{ p->coef=p->coef+nterm->coef;g=1;delete nterm;if(p->coef==0)//节点的系数为0时,删除{pre->link=p->link;delete p;}}}}}}void Output(Poly &pl) //输出多项式{term *p=pl->link;printf("输出多项式为:");int h=0;while(!h){if(pl->link!=p && p->coef>0)//最初不输出+号printf("+");printf("%0.1f",p->coef);switch(p->exp)//输出指数格式{case 0:break;case 1:printf("X");break;default :printf("X^");printf("%d",p->exp);}if(p->link==NULL)//循环结束条件h=1;elsep=p->link;}printf("\n");}void Add(Poly &A, Poly &B, Poly &C ,int Q) //多项式加减//两个一元多项式链表的头结点分别是A,B,相加减结果为C {term *pa,*pb,*pc,*p,*s;float temp;C=new term;C->link=NULL;pc=C;pa=A->link;pb=B->link;while(pa!=NULL && pb!=NULL)//pa,pb都存在时{s=new term;if(!s){printf("error");exit(1);}if(pa->exp==pb->exp) //系数相等{if(Q==1) //多项式相加temp=pa->coef+pb->coef;else //多项式相减if(pa->coef>pb->coef)temp=pa->coef-pb->coef;elsetemp=pb->coef-pa->coef;if(temp>0){pc->link=s;pc=pc->link;pc->coef=temp;pc->exp=pa->exp;}else//加减后的系数为0,删除delete s;pa=pa->link;pb=pb->link;}else //系数不相等if(pa->exp<pb->exp){pc->link=s;pc=pc->link;pc->coef=pa->coef;pc->exp=pa->exp;pa=pa->link;}else{pc->link=s;pc=pc->link;pc->coef=pb->coef;pc->exp=pb->exp;pb=pb->link;}}p=(pa?pa:pb);//P指向剩余链表的地址while(p!=NULL)//剩余结点原样输入{pc->link=new term;if(!pc->link){printf("error");exit(1);}pc=pc->link;pc->coef=p->coef;pc->exp=p->exp;p=p->link;}pc->link=NULL;}void main(){Poly pa,pb,pc;printf("\n");printf("//**此程序可以实现两个多项式的加减**//\n");printf("*****输入第一个多项式*****:\n");Input(pa);Output(pa);printf("\n");printf("\n");printf("*****输入第二个多项式*****:\n");Input(pb);Output(pb);int Q;printf("/////////请选择操作/////////\n");printf("********1:两多项式相加*******\n");printf("********2:两多项式相减*******\n");scanf("%d",&Q);Add(pa,pb,pc,Q);printf("你所需要的结果是:\n");Output(pc);}测试结果。
多项式的加法之顺序表表示
list_student L2;
list_student L3;
int num1;
int num2;
void creat1()
{
int i = 0;
int m;
int huanmi,huanxi;
L1.dataxi = (int *) malloc (max_list_size * sizeof(int) );
printf("请输入第%d项的幂数:\n", i);
scanf("%d", &L1.datami[i]);
i++;
L1.length++;
for( ; i < num1; i++)
{
printf("请输入第%d项的系数:\n", i);
scanf("%d", &L1.dataxi[i]);
printf("请输入第%d项的幂数:\n", i);
m++;
b++;
L3.length++;
}
}
else
{
L3.datami[m] = L1.datami[a];
L3.dataxi[m] = L1.dataxi[a]+ L2.dataxi[b];
m++;
a++;
b++;
L3.length++;
}
}
if( a == num1)
{
while(b <= num2)
多项式加法算法
#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#include "common.h"#include "polylist.h"typedef struct Polynode{int coef;int exp;Polynode *next;}Polynode, *Polylist;void polycreate(Polylist head){Polynode *rear, *s;int c,e;rear=head; /* rear 始终指向单链表的尾,便于尾插法建表*/scanf("%d,%d",&c,&e); /*键入多项式的系数和指数项*/while(c!=0) /*若c=0,则代表多项式的输入结束*/ {s=(Polynode*)malloc(sizeof(Polynode)); /*申请新的结点*/s->coef=c;s->exp=e;rear->next=s; /*在当前表尾做插入*/rear=s;scanf("%d,%d",&c,&e);}rear->next=NULL; /*将表的最后一个结点的next置NULL,以示表结束*/}void polyadd(Polylist polya, Polylist polyb)/*此函数用于将两个多项式相加,然后将和多项式存放在多项式polya中,并将多项式ployb 删除*/{Polynode *p, *q, *pre, *temp;int sum;p=polya->next; /*令p和q分别指向polya和polyb多项式链表中的第一个结点*/q=polyb->next;pre=polya; /* r指向和多项式的尾结点*/while (p!=NULL && q!=NULL) /*当两个多项式均未扫描结束时*/{if (p->exp < q->exp)/*如果p指向的多项式项的指数小于q的指数,将p结点加入到和多项式中*/ {pre->next=p;pre=p;p=p->next;}elseif ( p->exp == q->exp) /*若指数相等,则相应的系数相加*/{sum=p->coef + q->coef;if (sum != 0){p->coef=sum;pre->next=p;pre=p;p=p->next;temp=q;q=q->next;free(temp);}else{temp=p;p=p->next;free(temp);/*若系数和为零,则删除结点p与q,并将指针指向下一个结点*/temp=q;q=q->next;free(temp);}}else{pre->next=q;pre=q; /*将q结点加入到和多项式中*/q = q->next;}}if(p!=NULL) /*多项式A中还有剩余,则将剩余的结点加入到和多项式中*/ pre->next=p;else /*否则,将B中的结点加入到和多项式中*/pre->next=q;}void main(){Polylist polya,polyb;Polynode *p;printf("请输入数据建立多项式A:(以0,0结束!)\n");polya=(Polynode *)malloc(sizeof(Polynode));polycreate(polya);p = polya->next;while(p!=NULL){printf("%d %d\n",p->coef,p->exp);p=p->next;}printf("请输入数据建立多项式B:(以0,0结束!)\n");polyb=(Polynode *)malloc(sizeof(Polynode));polycreate(polyb);p = polyb->next;while(p!=NULL){printf("%d %d\n",p->coef,p->exp);p=p->next;}polyadd(polya,polyb);printf("相加后的多项式为:\n");p = polya->next;while(p!=NULL){printf("%d %d\n",p->coef,p->exp);p=p->next;}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言题目-多项式加法
多项式加法(10分)
题目内容:
一个多项式可以表达为x的各次幂与系数乘积的和,比如:
2x6+3x5+12x3+6x+20
现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。
程序要处理的幂最大为100。
输入格式:
总共要输入两个多项式,每个多项式的输入格式如下:
每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,所有的系数都是整数。
第一行一定是最高幂,最后一行一定是0次幂。
注意第一行和最后一行之间不一定按照幂次降低顺序排列;如果某个幂次的系数为0,就不出现在输入数据中了;0次幂的系数为0时还是会出现在输入数据中。
输出格式:
从最高幂开始依次降到0幂,如:
2x6+3x5+12x3-6x+20
注意其中的x是小写字母x,而且所有的符号之间都没有空格,如果某个幂的系数为0则不需要有那项。
输入样例:
6 2
5 3
3 12
1 6
0 20
6 2
5 3
2 12
1 6
0 20
输出样例:
4x6+6x5+12x3+12x2+12x+40
时间限制:500ms内存限制:32000kb
代码
#include <stdio.h> //此程序需要分3种情况,一、幂为0;二、幂为1;三、幂大于1
int a[105],b[105];
int main(){
int x,y;
while (~scanf("%d%d",&x,&y)){//存储第一个多项式的数据,当幂为0时停止输入
a[x]=y;
if (x==0) break;
}
while (~scanf("%d%d",&x,&y)){//存储第二个多项式的数据,当幂为0时停止输入
b[x]=y;
if (x==0) break;
}
for (int i=0;i<=100;i++)
a[i]=a[i]+b[i]; //将两个多项式的系数相加保存到数组a[i]中
int flag=0; //用此数来区分输出的式子是否是第一个数字,是第一个式子 flag就为0,不是第一个式子 flag 就为1
for (int i=20;i>1;i--){
if (a[i]){ //系数不为0
if (a[i]>0){ //系数大于0的情况
if (a[i]==1){ //系数等于1的情况
if (flag==0){//输出的式子是第一个式子
printf("x%d",i);
flag=1;
}
else printf("+x%d",i); //输出的式子不是第一个式子
else{ //系数大于1的情况 if (flag==0){
printf("%dx%d",a[i],i);
flag=1;
}
else printf("+%dx%d",a[i],i); }
}
else{ //系数小于0的情况
if (a[i]==-1)
printf("-x%d",i);
else printf("%dx%d",a[i],i);
}
}
}
if (a[1]){
if (a[1]>0){
if (a[1]==1){
if (flag==0){
printf("x");
flag=1;
else printf("+x");
}
else{
if (flag==0){
printf("%dx",a[1]); flag=1;
}
else printf("+%dx",a[1]); }
}
else{
if (a[1]==-1)
printf("-x");
else
printf("%dx",a[1]);
}
}
if (a[0]>0){
if (flag==0){
printf("%d",a[0]);
flag=1;
}
else
printf("+%d",a[0]); }
if (a[0]<=0){
printf("%d",a[0]);
}
printf("\n");
return 0;
}
(学习的目的是增长知识,提高能力,相信一分耕耘一分收获,努力就一定可以获得应有的回报)。