一元多项式相乘
2018-01-09 16:15
169 查看
成绩 | 10 | 开启时间 | 2017年09月27日 星期三 14:00 |
折扣 | 0.8 | 折扣时间 | 2017年10月20日 星期五 23:55 |
允许迟交 | 否 | 关闭时间 | 2018年01月8日 星期一 23:55 |
题目说明:
要求采用链表形式,求两个一元多项式的乘积:h3 = h1*h2。函数原型为:void multiplication( NODE * h1, NODE * h2, NODE * h3 )。
输入:
输入数据为两行,分别表示两个一元多项式。每个一元多项式以指数递增的顺序输入多项式各项的系数(整数)、指数(整数)。例如:1+2x+x2表示为:<1,0>,<2,1>,<1,2>,
输出:
以指数递增的顺序输出乘积: <系数,指数>,<系数,指数>,<系数,指数>,零多项式的输出格式为:<0,0>,
预设代码
前置代码
view plainprint?/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{ int
4000
coef, exp;
struct node *next;
} NODE;
void multiplication( NODE *, NODE * , NODE * );
void input( NODE * );
void output( NODE * );
void input( NODE * head )
{ int flag, sign, sum, x;
char c;
NODE * p = head;
while ( (c=getchar()) !='\n' )
{
if ( c == '<' )
{ sum = 0;
sign = 1;
flag = 1;
}
else if ( c =='-' )
sign = -1;
else if( c >='0'&& c <='9' )
{ sum = sum*10 + c - '0';
}
else if ( c == ',' )
{ if ( flag == 1 )
{ x = sign * sum;
sum = 0;
flag = 2;
sign = 1;
}
}
else if ( c == '>' )
{ p->next = ( NODE * ) malloc( sizeof(NODE) );
p->next->coef = x;
p->next->exp = sign * sum;
p = p->next;
p->next = NULL;
flag = 0;
}
}
}
void output( NODE * head )
{
while ( head->next != NULL )
{ head = head->next;
printf("<%d,%d>,", head->coef, head->exp );
}
printf("\n");
}
int main()
{ NODE * head1, * head2, * head3;
head1 = ( NODE * ) malloc( sizeof(NODE) );
input( head1 );
head2 = ( NODE * ) malloc( sizeof(NODE) );
input( head2 );
head3 = ( NODE * ) malloc( sizeof(NODE) );
head3->next = NULL;
multiplication( head1, head2, head3 );
output( head3 );
return 0;
}
/* PRESET CODE END - NEVER TOUCH CODE ABOVE */
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示 <1,0>,<2,1>,<1,2>,↵ <1,0>,<1,1>,↵ | 以文本方式显示 <1,0>,<3,1>,<3,2>,<1,3>,↵ | 1秒 | 1024KB | 0 |
测试用例 2 | 以文本方式显示 <0,0>,↵ <1,20>,<-8,40>,↵ | 以文本方式显示 <0,0>,↵ | 1秒 | 1024KB | 0 |
测试用例 3 | 以文本方式显示 <1,20>,<-8,40>,↵ <0,0>,↵ | 以文本方式显示 <0,0>,↵ | 1秒 | 1024KB | 0 |
测试用例 4 | 以文本方式显示 <-1,0>,<1,1>,↵ <1,0>,<1,1>,↵ | 以文本方式显示 <-1,0>,<1,2>,↵ | 1秒 | 1024KB | 0 |
测试用例 5 | 以文本方式显示 <5,0>,<10,1>,↵ <2,0>,<3,1>,<4,2>,<5,3>,↵ | 以文本方式显示 <10,0>,<35,1>,<50,2>,<65,3>,<50,4>,↵ | 1秒 | 1024KB | 0 |
void multiplication(NODE *head1, NODE *head2, NODE *head3) { NODE*p1 = head3; NODE*p2 = head3; NODE*h1 = head1->next; NODE*h2 = head2->next; while (h1) { while (h2) { int coef = h1->coef*h2->coef; if (coef == 0) { h2 = h2->next; continue; } int exp = h1->exp+h2->exp; if (p1->next == NULL) { NODE*tmp = (NODE*)malloc(sizeof(struct node)); tmp->coef = coef; tmp->exp = exp; p1->next = tmp; tmp->next = NULL; } else { while (p2->next&&exp>p2->next->exp) { p2 = p2->next; } NODE*tmp = p2->next; if (p2->next == NULL) { NODE*pnew = (NODE*)malloc(sizeof (struct node)); pnew->coef = coef; pnew->exp = exp; p2->next = pnew; pnew->next = NULL; } else if (tmp->exp == exp) { tmp->coef += coef; if (tmp->coef == 0) { NODE*mark = tmp->next; p2->next = mark; free(tmp); } } else if (tmp->exp > exp) { NODE*pnew = (NODE*)malloc(sizeof (struct node)); pnew->coef = coef; pnew->exp = exp; p2->next = pnew; pnew->next = tmp; } } h2 = h2->next; p2 = head3; } h2 = head2->next; h1 = h1->next; } if (head3->next==NULL) { NODE*end = (NODE*)malloc(sizeof(struct node)); end->coef = 0; end->exp = 0; end->next = head3->next; head3->next = end; } }
相关文章推荐
- 数据结构课程设计一元多项式的相加和相乘
- 一道 google曾出过的笔试题:编程实现对数学一元多项式的相加和相乘操作
- 数据结构课程笔记--(2)一元多项式的和还有相乘
- 一元多项式的相乘
- 数据结构 一元多项式的创建、显示、相加、相减、相乘
- 【数据结构 链表的应用】一元多项式相加及相乘 和对问题的分析
- 一元多项式的相加、相乘
- 【线性表】一元多项式相乘
- 一道 google曾出过的笔试题:编程实现对数学一元多项式的相加和相乘操作(1)
- 用单链表表示一元多项式及相加相减相乘运算
- 【线性表】一元多项式相乘
- 一元多项式相乘 - 链表的简单应用
- 两个一元多项式相乘,数组与链表实现
- 【练习】一元多项式的表示与相乘
- 一元多项式相乘链表的实现
- 南邮数据结构实验1.3 一元多项式的相加和相乘
- 【实验】一元多项式的相加与相乘
- 数据结构(14)线性表之C++实现一元多项式相乘
- 一元多项式相加与相乘(C++)
- PAT1010. 一元多项式求导 (25)