您的位置:首页 > 其它

一元多项式相乘

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秒1024KB0
测试用例 2以文本方式显示

<0,0>,↵

<1,20>,<-8,40>,↵

以文本方式显示

<0,0>,↵

1秒1024KB0
测试用例 3以文本方式显示

<1,20>,<-8,40>,↵

<0,0>,↵

以文本方式显示

<0,0>,↵

1秒1024KB0
测试用例 4以文本方式显示

<-1,0>,<1,1>,↵

<1,0>,<1,1>,↵

以文本方式显示

<-1,0>,<1,2>,↵

1秒1024KB0
测试用例 5以文本方式显示

<5,0>,<10,1>,↵

<2,0>,<3,1>,<4,2>,<5,3>,↵

以文本方式显示

<10,0>,<35,1>,<50,2>,<65,3>,<50,4>,↵

1秒1024KB0
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: