主题:求助一道关于一元多项式的设计
cl820627
[专家分:0] 发布于 2006-06-27 21:33:00
大哥大姐:
小弟有一道题目关于一元多项式的,老师布置的课程设计,快交了,有点急,拜托。
题目要求:
一元多项式计算要求:能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加。相减。相乘,并将结果输出 。
谢谢各位了!!
回复列表 (共2个回复)
沙发
wuchengwei [专家分:1650] 发布于 2006-06-28 20:13:00
没看到链表排序前做的
////////////////////////////////////////////////////////////////////////////////
//
// 43. 44. 实现两个整系数一元多项式的加法与乘法。例如, 对于多项式
// 5*X^6+4*X^3-7*X^4+1 与多项式 50*X^2+4*X, 运算结果为:
// 5*X^6-7*X^4+4*X^3+50*X^2+4*X+1。
// 250*x^8+20*x^7-350*x^6+172*x^5+16*x^4+50*x^2+4*x
//
// 程序要求:键盘输入多项式的各项系数及指数,每项系数及指数为一组数据(系
// 数及指数之一可为零),以'0 0'结束一个多项式的输入,结果按降幂排列,同类
// 项要合并(指数最大不超过30)。
// 上例第一式的输入为: 5 6
// 4 3
// -7 4
// 1 0
// 0 0
// 输出结果应为:5*x^6-7*x^4+4*x^3+50*x^2+4*x+1.
// 250*x^8+20*x^7-350*x^6+172*x^5+16*x^4+50*x^2+4*x.
////////////////////////////////////////////////////////////////////////////////
#include "stdio.h"
#include "malloc.h"
#include "memory.h"
#include "process.h"
typedef struct
{
int coe;
int exp;
}elem;
typedef struct node
{
elem data;
node *next;
}node;
typedef struct link
{
node *head, *tail;
int length;
}link;
bool initial(link &l)
{
if(!(l.head = (node *)malloc(sizeof(node))))
return false;
l.tail = l.head;
l.length = 0;
return true;
}
void makenode(link &l, int coe, int exp)
{
l.tail->next = (node *)malloc(sizeof(node));
l.tail = l.tail->next;
l.tail->data.coe = coe;
l.tail->data.exp = exp;
l.tail->next = NULL;
++l.length;
}
void print(link l)
{
node *p = l.head->next;
char *s;
if(!p)
return;
while(p)
{
s = (p == l.head->next)? ""
:((p->data.coe > 0)?" +":" ");
if(p->data.coe == 1)
{
if(p->data.exp == 1)
printf("%sx", s);
else if(p->data.exp == 0)
printf("%s%d", s, p->data.coe);
else
printf("%sx^%d", s, p->data.exp);
}
else
{
if(p->data.exp == 1)
printf("%s%d*x", s, p->data.coe);
else if(p->data.exp == 0)
printf("%s%d", s, p->data.coe);
else
printf("%s%d*x^%d", s, p->data.coe, p->data.exp);
}
p = p->next;
}
printf("\t length = %d\n", l.length);
}
void create(link &l, char *s)
{
int coe, exp;
printf("\ninput the coefficient and exponential of the %s polynomial:\n", s);
scanf("%d %d", &coe, &exp);
while(coe)
{
makenode(l, coe, exp);
scanf("%d %d", &coe, &exp);
}
printf("the %s polynomial is :\n", s);
print(l);
}
void sort(elem *a, int size)
{
elem *p, *q, temp;
for(p = a; p< a +size -1; p++)
for(q = p; q < a +size; q++)
if(q->exp > p->exp)
{
temp = *q;
*q = *p;
*p = temp;
}
}
void combine(elem *a, int size)
{
int i, j;
for(i = 0; i < size; i = j)
{
for(j = i+1; a[j].exp == a[i].exp && j < size; j++)
{
a[i].coe += a[j].coe;
a[j].coe = 0;
}
}
}
板凳
wuchengwei [专家分:1650] 发布于 2006-06-28 20:13:00
void clearlink(link &l)
{
node *p = l.head->next, *temp;
while(p)
{
temp = p->next;
free(p);
p = temp;
}
l.length = 0;
l.head->next = NULL;
l.tail = l.head;
}
void tidy(link &l)
{
int size = l.length, i;
elem *a = new elem[size];
memset(a, 0, size*sizeof(elem));
node *p = l.head->next;
for(i = 0; p; i++, p = p->next)
{
a[i].coe = p->data.coe;
a[i].exp = p->data.exp;
}
sort(a, size);
combine(a, size);
clearlink(l);
for(i = 0; i < size; i++)
{
if(a[i].coe == 0)
continue;
makenode(l, a[i].coe, a[i].exp);
}
}
void multiply(link la, link lb)
{
node *p, *q;
link lc;
if(!initial(lc))
{
printf("Initial false...\n");
exit(-1);
}
for(p = la.head->next; p; p = p->next)
{
for(q = lb.head->next; q; q = q->next)
makenode(lc, p->data.coe *q->data.coe, p->data.exp +q->data.exp);
}
printf("\nthe multi-polynomial is :\n");
tidy(lc);
print(lc);
clearlink(lc);
}
void merge(link &la, link &lb)
{
node *p;
link lc;
if(!initial(lc))
{
printf("Initial false...\n");
exit(-1);
}
for(p = la.head->next; p; p = p->next)
makenode(lc, p->data.coe, p->data.exp);
for(p = lb.head->next; p; p = p->next)
makenode(lc, p->data.coe, p->data.exp);
printf("\nthe merge-polynomial is :\n");
tidy(lc);
print(lc);
clearlink(lc);
}
void main()
{
link la, lb;
if(!initial(la) || !initial(lb))
{
printf("Initial false...\n");
exit(-1);
}
create(la, "first");
create(lb, "second");
merge(la, lb);
multiply(la, lb);
}
减法没有,重载下加法的就可以了
我来回复