当前位置:首页 » 编程语言 » c语言两个多项式

c语言两个多项式

发布时间: 2022-05-09 23:58:07

c语言,描述多项式加法

1. #include"malloc.h"
2. typedef struct Polyn /*定义多项式每一项的类型*/
3. {
4. float cofe; /*每一项系数*/
5. int expn; /*每一项的指数*/
6. struct Polyn *next;
7. struct Polyn *prior;
8. }*Pol.yn,SNode;
9. void setPolyn(Polyn *t1,Polyn *t2,int n) /*建立多项式*/
10. {
11. float a;
12. int i,b;
13. *t1=(SNode *)malloc(sizeof(SNode)); /*创建头节点*/
14. (*t1)->next=NULL;
15. for(i=0;i<n;i++)
16. {
17. *t2=(SNode *)malloc(sizeof(SNode));
18. scanf("%f,%d;",&a,&b);
19. (*t2)->cofe=a; (*t2)->expn=b;
20. (*t1)->next->prior=(*t2);
21. (*t2)->prior=(*t1);
22. (*t2)->next=(*t1)->next;
23. (*t1)->next=(*t2);
24. } /*创建每一项并连接成多项式*/
25. }
26. void print(Polyn *t) /*输出多项式*/
27. {
28. Polyn p;
29. for(p=(*t)->next;p!=NULL;p=p->next)
30. printf("%f,%d;",p->cofe,p->expn);
31. printf("\n");
32. }
33. void arrange(Polyn *t) /*化简多项式*/
34. {
35. float m1;
36. int m2;
37. Polyn p,q,r,s;
38. for(p=(*t)->next;p!=NULL;p=p->next)
39. for(q=p->next;q!=NULL;q=q->next)
40. if((p->expn)>(q->expn))
41. {
42. m1=p->cofe;p->cofe=q->cofe;q->cofe=m1;
43. m2=p->expn;p->expn=q->expn;q->expn=m2;
44. } /*冒泡法多项式指数排序*/
45. for(p=(*t)->next;p!=NULL;p=p->next)
46. if((p->expn)==(p->next->expn))
47. {
48. r=p->next;
49. p->cofe+=p->next->cofe;
50. p->next=p->next->next;
51. p=p->prior; /*指针指向上一结点(须重新处理现在处理 的结点)*/
52. free(r);
53. if((p->next->cofe)==0)
54. {
55. s=p->next;
56. p->next=p->next->next;
57. free(s);
58. }
59. } /*多项式相同指数项系数求和,化简多项式*/
60. }
61. void linkPolyn(Polyn *t1,Polyn *t2) /*两个多项式连接*/
62. {
63. Polyn p,q;
64. for(p=(*t2)->next;p!=NULL;p=p->next)
65. q=p;
66. p=(*t2)->next;
67. q->next=(*t1)->next;
68. (*t1)->next->prior=q;
69. (*t1)->next=p;
70. p->prior=(*t1);
71. }
72. main() /*主函数*/
73. {
74. Polyn La,la,Lb,lb;
75. int n,m; /*多项式项数*/
76. printf("enter La’s lenth:");
77. scanf("%d",&n);
78. setPolyn(&La,&la,n);
79. arrange(&La);
80. printf("after arrange La is:\n");
81. print(&La); /*输入多项式La,化简并输出*/
82. printf("enter Lb’s lenth:");
83. scanf("%d",&m);
84. setPolyn(&Lb,&lb,m);
85. arrange(&Lb);
86. printf("after arrange Lb is:\n");
87. print(&Lb); /*输入多项式Lb,化简并输出*/
88. linkPolyn(&La,&Lb); /*La与Lb连接,形成新的La*/
89. arrange(&La); /*化简La*/
90. printf("after add Polyn is :\n");
91. print(&La); /*输出结果*/
92. }

Ⅱ 如何用C语言实现两个一元多项式的相加和相乘

没有别的好办法,你看这样行不行,不行你自己再想想吧
#include
void
main()
{
int
a1,b1,c1,d1,e1,f1,a2,b2,c2,d2,e2,f2;
printf("ax^5+bx^4+cx^3+dx^2+ex+f=0\n");
printf("请输入:a
b
c
d
e
f\n");
printf("第一个:");
scanf("%d%d%d%d%d%d",&a1,&b1,&c1,&d1,&e1,&f1);
printf("第二个:");
scanf("%d%d%d%d%d%d",&a2,&b2,&c2,&d2,&e2,&f2);
printf("两式相加后得:\n");
printf("%dx^5+%dx^4+%dx^3+%dx^2+%dx+%d=0\n",a1+a2,b1+b2,c1+c2,d1+d2,e1+e2,f1+f2);
}
由于变量太多!输出时要注意哦
希望回答对你有帮助!

Ⅲ 用C语言编程:输入两个多项式的各项系数和指数,编写程序求出他们的和,并要求与手写习惯相同的格式输出

//试试看这个,以前写的,应该满足你的要求

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

typedefstruct_PolyNode{
intindex;
intcofficient;
}NodeType;

typedefstruct_polynomial{
NodeTypedata;
struct_polynomial*next;
}Polynomial;

voidappend(Polynomial*head,NodeTypedata){
Polynomial*p=(Polynomial*)malloc(sizeof(Polynomial));
p->data=data;
p->next=head->next;
head->next=p;
}

voidinput(Polynomial*head){
NodeTypedata;
do{
scanf("%d%d",&data.cofficient,&data.index);
append(head,data);
}while(data.cofficient!=0&&data.index!=-1);
}

/**
*合并同类项并去除系数为0的项
*/
voidmerge(Polynomial*head){
Polynomial*p;
for(p=head->next;p->next;p=p->next)
if(p->data.index==p->next->data.index){
p->data.cofficient+=p->next->data.cofficient;
p->next->data.cofficient=0;
}
for(p=head;p->next;)
if(p->next->data.cofficient==0){
Polynomial*q;
q=p->next;
p->next=q->next;
free(q);
}
else
p=p->next;
}

/**
*按指数从高到低排序
*/
voidsort(Polynomial*head){
Polynomial*p,*q;
for(p=head->next;p->next;p=p->next){
NodeTypet=p->data;
for(q=p->next;q;q=q->next){
if(t.index<q->data.index){
p->data=q->data;
q->data=t;
t=p->data;
}
}
}
}

Polynomial*add(Polynomial*a,Polynomial*b){
Polynomial*p,*ret=(Polynomial*)malloc(sizeof(Polynomial));
ret->next=NULL;
for(p=a->next;p;p=p->next)
append(ret,p->data);
for(p=b->next;p;p=p->next)
append(ret,p->data);
returnret;
}

Polynomial*multiply(Polynomial*a,Polynomial*b){
Polynomial*p,*q,*ret=(Polynomial*)malloc(sizeof(Polynomial));
ret->next=NULL;
for(p=a->next;p;p=p->next)
for(q=b->next;q;q=q->next){
NodeTypedata={p->data.index+q->data.index,p->data.cofficient*q->data.cofficient};
append(ret,data);
}
returnret;
}

voiddisplay(Polynomial*head){
sort(head);
merge(head);
Polynomial*p;
for(p=head->next;p;p=p->next){
if(p->data.cofficient<0)
printf("-");
elseif(p!=head->next)
printf("+");
if(!(abs(p->data.cofficient)==1&&p->data.index>0))
printf("%d",abs(p->data.cofficient));
if(p->data.index>0){
printf("X");
if(p->data.index>1)
printf("^%d",p->data.index);
}
}
printf(" ");
}

intmain(){
Polynomial*a=(Polynomial*)malloc(sizeof(Polynomial)),
*b=(Polynomial*)malloc(sizeof(Polynomial));
input(a);
input(b);
display(a);
display(b);
display(add(a,b));
display(multiply(a,b));
return0;
}

Ⅳ C语言——两个一元多项式P(x)和Q(x)相加的问题

第一类书上有就不写了;
第二类:
数据结构
int
data;
int
index;
linklist
next;
void
f_p_add(linklist
&a,linklist
b)
{//把b中的元素一个一个的插入到a中
linklist
p=a->next,t;
b=b->next;
while(b)
{
while(b->index!=p->index)//寻找指数与b->data相同的结点
{
if(!p->next)//搜索到最后没有找到指数与b->data相同的结点,把它插入到最后
{
t=b;
b=b->next;
t->next=NULL;
p->next=t;
break;
}
if(b->index==p->index)//找到指数与b->data相同的结点
{
p->data=p->data+b->data;
t=b;
b=b->next;
free(t);
}
p=p->next;
}
b=b->next;
}//while(b)
}
网吧的机子没装vc,也就没运行。

Ⅳ c语言写俩个多项式相乘

这个是母函数的知识,这一块我没怎么看,楼主可以自己网络一下。大概的意思就是: a[x]:x表示指数,a[x]存系数。如 3x^2+4x+5:可表示为:a[2]=3,a[1]=4,a[0]=5. 多项式加减就是a[x]相加减。多项式相乘就是x相加。也就是下标的运算

Ⅵ 给定两个多项式,实现两个多项式相加算法。用c语言编程

输入data2的时候,你看你for里面是j,scanf里面是i,读不进去
for(j=0;j<n;j++)
scanf("%d%d",&data2[i].a,&data2[i].b);
最后两行

for(i=0;i<=t;i++)
printf("%d %d\n",data[t].a,data[t].b);
i是步过值,结果用t输出,怎么也得用data[i].a吧

Ⅶ 数据结构c语言 用单链表储存一元多项式,并实现两个多项式的相加运算(语法没有错误)可能指针错了

void Add(LinkList *P1,LinkList *P2,LinkList *&P3)里面的算法有点问题!

我依照你的算法,补充了一下程序!里面新编写了一个函数void CopyList(LinkList * a,LinkList *b) ;
同时void Add(LinkList *P1,LinkList *P2,LinkList *&P3做了一点修改!也许,程序的可读性不好,你可以自己再修改!代码如下:

#include<stdio.h>
#include <malloc.h>
#define MAX 20 //多项式最多项数
typedef struct{
double ratio;
int exp;
} ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LinkList;
void CreateListR(LinkList *&L,ElemType a[],int n)
{ LinkList *s,*r;
int i;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
for (i=0;i<n;i++)
{ s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
/*
将一个链表的部分或全部结点复制到另一个链表中,
a是新链表的最后一个结点,b是被复制链表的某一结点
即让要复制的结点加到新链表的尾部*/
void CopyList(LinkList * a,LinkList *b) //
{
LinkList *temp,*last; //temp临时指针,last指向新链表的最后一个结点
last=a;
/*循环体中实现从结点b开始到链表结束,将各结点复制到新链表中*/
while(b!=NULL)
{
temp=(LinkList *)malloc(sizeof(LinkList)); //新建一个结点
temp->data=b->data; //将链表当前要复制的结点b复制到新结点中
last->next=temp; //将新建的结点加到新链表的末端
last=temp; //last指向尾结点,刚才新建的结点已成为新链表的尾结点
b=b->next; //遍历链表的下一个结点b
}
last->next=NULL; //新链表尾结点中next指针的值设为NULL,即新链表创建完成
}
void DestroyList(LinkList *&L) //销毁链表
{
LinkList *pre =L, *p=L->next;
while (p != NULL)
{
free(pre);
pre = p;
p = pre->next;
}
free(pre);
}
void DispList(LinkList *L)
{ LinkList *p=L->next;
while (p!=NULL)
{ printf("%fx^%d ",p->data.ratio,p->data.exp);
p=p->next;
}
printf("\n");
}
void Add(LinkList *P1,LinkList *P2,LinkList *&P3)
{ LinkList *p=P1->next,*q=P2->next;
LinkList *head; //链表P3的头指针
head=(LinkList *)malloc(sizeof(LinkList)); //新建头结点
P3=head;
int i;
for (i = 0; i<MAX; i++)
{
P1=(LinkList *)malloc(sizeof(LinkList)); //新建一个结点
P3->next=P1; //将新建的结点加到合并后链表中
P3=P1;

/*注意这里是'<',链表的结点已经从小到大排列有序,
每次比较都选择较小的结点加到合并后的链表P3中*/

if ((p->data.exp)<(q->data.exp))
{
P3->data.exp = p->data.exp;
P3->data.ratio = p->data.ratio;
if (p->next!=NULL) //如果链表P1的下一个结点存在,则遍历下一个结点
p = p->next;
else //否则,将另一个链表P2剩余的结点加到链表P3中,链表P3建立完成
{
CopyList(P3,q);
break;
}
}

/*下面其他两种情况的处理都是同一个道理,
在比较过程中,只要其中一个链表的所有结点都遍历了,
此时只需要将另一个链表的剩余结点都加到P3中,就可以完成链表的合并
*/

else if ((p->data.exp) == (q->data.exp))
{
P3->data.ratio = (p->data.ratio) + (q->data.ratio);
P3->data.exp = p->data.exp;
if (p ->next!= NULL)
p = p->next;
else
{
CopyList(P3,q->next);
break;
}
if (q->next != NULL)
q = q->next;
else
{
CopyList(P3,p->next);
break;
}
}
else{
P3->data.exp = q->data.exp;
P3->data.ratio = q->data.ratio;
if (q->next != NULL)
q= q->next;
else
{
CopyList(P3,p);
break;
}
}
}
/*在建立链表过程中,指针P3的值一直在改变,因此在完成合并链表后必须使P3指向头结点*/
P3=head;
}
void BubbleSort(ElemType st[],int n)
{
int i, j;
ElemType tmp;
for (i = 0; i < n; i++)
{
for(j=n-1;j>i;j--)
if(st[j].exp<st[j-1].exp)
{
tmp=st[j];
st[j]=st[j-1];
st[j - 1] = tmp;
}
}
}
void main()
{
int num1=5, num2=5;
LinkList *L1, *L2, *L3;
L1 = (LinkList *)malloc(sizeof(LinkList));
L2 = (LinkList *)malloc(sizeof(LinkList));
L3 = (LinkList *)malloc(sizeof(LinkList));
ElemType st1[] = { {5,5}, {4,4}, {7,7}, {6,6}, {2,2} };
ElemType st2[] = { {5,5}, {8,8}, {7,7}, {3,3}, {2,2} };
BubbleSort(st1, num1);
BubbleSort(st2, num2);
CreateListR(L1, st1, num1);
CreateListR(L2, st2, num2);
DispList(L1);
DispList(L2);
Add(L1, L2, L3);
DispList(L3);
DestroyList(L1);
DestroyList(L2);
DestroyList(L3);

}

Ⅷ C语言:用单链表实现任意两个一元多项式的加、减法运算

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 7
typedef enum { add, nul, sub, div1, yu, l, r }OP;
int a[N][N] = {
{ 0, 0, -1, -1, -1, 1, 2 },
{ 0, 0, -1, -1, -1, 1, 2 },
{ 1, 1, 0, 0, 0, 1, 2 },
{ 1, 1, 0, 0, 0, 1, 2 },
{ 1, 1, 0, 0, 0, 1, 2 },
};

int top;
OP beg;
int b[1024];
OP op[1024];

void init_nu( ){ top = 0; }
void push_nu( int term ){ b[top++] = term; }
int pop_nu( ){ return b[--top]; }
int is_empty_nu( ){ return top == 0; }
void destory_nu( ) { top = 0; }

void init_sign( ){ beg = 0; }
void push_sign( OP sign ){ op[beg++] = sign; }
void destory_sign( ){ beg = 0; }
OP pop_sign( ){ return op[--beg];}
OP get_sign( ){ return op[beg - 1]; }
int is_empty_sign( ){return beg == 0; }
int eval()
{
int i, j;
i = pop_nu();
j = pop_nu();
switch( pop_sign() )
{
case '+': push_nu( j + i ); break;
case '-': push_nu( j - i ); break;
case '*': push_nu( j * i ); break;
case '/': push_nu( j / i ); break;
case '%': push_nu( j & i ); break;
defult: break;
}
}
int change( char *s )
{
int i;
int n = strlen( s );
for( i = 0; i < n; i++ )
{
if( s[i] >= '0' && s[i] <= '9' )
push_nu( 0 );
while( s[i] >= '0' && s[i] <= '9' )
push_nu( 10 * pop_nu() + s[i++] - '0' );
switch( s[i] )
{
case '+': while( a[add][get_sign()] <= 0 )

eval();
push_sign( add ); break;
case '-': while( a[nul][get_sign()] <= 0 )
eval();
push_sign( nul ); break;
case '*': while( a[sub][get_sign()] <= 0 )
eval();
push_sign( sub ); break;
case '/': while( a[div1][get_sign()] <= 0 )
eval();
push_sign( div1 ); break;
case '%': while( a[yu][get_sign()] <= 0 )
eval();
push_sign( yu ); break;
case '(': push_sign( l ); break;
case ')': while( (get_sign()) != l )
eval();
pop_sign();
break;
defult: break;
}

}
return pop_nu();
}
int main( void )
{
char *s = "((5-3)*2+4/2&2+1)";
init_nu();
init_sign();
printf( "%d\n", change( s ));
destory_nu();
destory_sign();
return 0;
}

以前编的,希望对你有帮助。

别忘了给我分。

Ⅸ 用C语言设计函数求两个一元多项式的乘积,要求能够运行,求编程大神指点。

你是要求这个表达式的值,还是显示表达式的描述方式哦?没有看明白输出。

Ⅹ 急急急 关于c语言 两个一元多项式相加的问题

char,
a[n],
b[n],
c[n];
(把2个n次多项式按升序排列,系数分别放在a[n],b[n]中,空缺的项,系数为0,c[i]中为何的系数)
int
i;
for(i=0;i<n;i++)
c[i]=a[i]+b[i];

热点内容
notepad编写php 发布:2025-05-11 07:10:50 浏览:861
茄子快传的文件夹 发布:2025-05-11 07:04:30 浏览:732
手机指纹密码如何更换 发布:2025-05-11 07:02:22 浏览:121
java存储数据库 发布:2025-05-11 07:01:33 浏览:175
办理ca的初始密码是多少 发布:2025-05-11 06:54:55 浏览:423
忘记服务器地址 发布:2025-05-11 06:54:51 浏览:241
传奇qf脚本 发布:2025-05-11 06:35:21 浏览:447
我的世界等价交换服务器地址 发布:2025-05-11 06:34:49 浏览:432
ftp传图失败 发布:2025-05-11 06:34:47 浏览:856
安卓如何设置抖音自动播放 发布:2025-05-11 06:32:21 浏览:671