码迷,mamicode.com
首页 > 其他好文 > 详细

一元多项式的加/减法运算

时间:2020-07-01 21:58:20      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:lead   return   有序   main   names   ring   content   假设   ret   

问题描述 :

假设2个稀疏一元多项式分别由带头结点的有序单链表A和B存储(指数项递增有序)。现要求设计一个算法,实现稀疏一元多项式的加减法计算。要求使用A和B的原存储空间(运算后B不再存在,A链表中保存结果多项式)。输入中的单链表的长度不得在计算算法中利用,仅作为建表使用。

注意:加/减法计算后,如某一项的结果系数为0,则该项要从多项式链表中删除。

 

输入说明 :

第一行:加/减法选择(0:加法  1:减法)

第二行:一元多项式A的项数

第三行:一元多项式A的各项的系数(系数之间以空格分隔)

第四行:一元多项式A的各项的指数(指数之间以空格分隔)

第五行:一元多项式B的项数

第六行:一元多项式B的各项的系数(系数之间以空格分隔)

第七行:一元多项式B的各项的指数(指数之间以空格分隔)

如果A或B的项数为0,则认为输入的多项式只包含数字“0”,即系数为0,指数也为0。

输出说明 :

第一行:多项式A的第一项的系数、指数(以空格分隔)

第一行:多项式A的第二项的系数、指数(以空格分隔)

...

第n行:多项式A的第n项的系数、指数(以空格分隔) (假设多项式A的项数为n)

(空行)

第一行:多项式B的第一项的系数、指数(以空格分隔)

第一行:多项式B的第二项的系数、指数(以空格分隔)

...

第m行:多项式B的第m项的系数、指数(以空格分隔) (假设多项式B的项数为m)

(空行)

第一行:加/减法计算后,结果多项式A的第一项的系数、指数(以空格分隔)

第一行:加/减法计算后,结果多项式A的第二项的系数、指数(以空格分隔)

...

第p行:加/减法计算后,结果多项式A的第n项的系数、指数(以空格分隔) (假设结果多项式的项数为p)

 

(多项式之间以空行分隔,如果多项式只包含“0”,则相应的多项式输出"0 0",不包含引号。)

 

输入范例 :

1
6
7 3 -22 9 5 -8
0 1 7 8 17 100
3
8 22 -9
1 7 8

输出范例 :

7 0
3 1
-22 7
9 8
5 17
-8 100

8 1
22 7
-9 8

7 0
-5 1
-44 7
18 8
5 17
-8 100

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
typedef struct node
{
    int  factor;//系数
    int index;//指数
    struct node* next;
    node(int fa) :factor(fa),next(0){}
}Node;
void my_print(Node* head)
{
    Node* p = head->next;
    if(!p)printf("%d %d\n",0, 0);
    while (p)
    {
        printf("%d %d\n", p->factor, p->index);
        p = p->next;
    }
}
//创建带头节点的链表
Node* createList(int n)
{
    int i,val;
    vector<Node*> node_vec;
    Node* head = new Node(0);
    node_vec.push_back(head);//头结点
    for (i = 0; i < n; i++)
    {
        scanf("%d", &val);
        node_vec.push_back(new Node(val));
    }
    for (i = 1; i <= n; i++)
    {
        node_vec[i - 1]->next = node_vec[i];
        scanf("%d", &val);
        node_vec[i]->index = val;
    }
    return head;
}
Node* my_fun(Node* la, Node* lb, int mode)
{
    Node* pa=la->next, * pb=lb->next,* res=la,*res_tail=la;
    int temp;
    while (pa && pb)
    {
        if (pa->index == pb->index)
        {
            if (!mode)//+
                temp = pa->factor + pb->factor;
            else//-
                temp = pa->factor - pb->factor;
            if (temp)
            {
                res_tail->next = pa;
                pa->factor = temp;
                res_tail = pa;
            }    
            pa = pa->next;
            pb = pb->next;
        }
        else if (pa->index < pb->index)
        {
            res_tail->next = pa;
            res_tail = pa;
            pa = pa->next;
        }
        else
        {
            res_tail->next = pb;
            res_tail = pb;
            if (mode)pb->factor = -pb->factor;
            pb = pb->next;
        }
    }
    res_tail->next = NULL;
    if (pa)
        res_tail->next = pa;
    while (pb)
    {
        res_tail->next = pb;
        res_tail = pb;
        if (mode)pb->factor = -pb->factor;
        pb = pb->next;
    }
    return res;
}
int main()
{
    int mode;//0 加 1减
    scanf("%d", &mode);
    int n, i;
    scanf("%d", &n);
    Node* la = createList(n);
    scanf("%d", &n);
    Node* lb = createList(n);
    my_print(la); cout << endl;
    my_print(lb); cout << endl;
    Node* res = my_fun(la, lb, mode);
    my_print(res);
    return 0;
}

 

一元多项式的加/减法运算

标签:lead   return   有序   main   names   ring   content   假设   ret   

原文地址:https://www.cnblogs.com/lancelee98/p/13221665.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!