成绩 | 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>,
预设代码
前置代码
- /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */
- #include <stdio.h>
- #include <stdlib.h>
- typedef struct node
- { int 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秒 | 1024KB | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 1024KB | 0 |
测试用例 3 | 以文本方式显示
| 以文本方式显示
| 1秒 | 1024KB | 0 |
测试用例 4 | 以文本方式显示
| 以文本方式显示
| 1秒 | 1024KB | 0 |
测试用例 5 | 以文本方式显示
| 以文本方式显示
| 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;
}
}