• PTA 02-线性结构2 一元多项式的乘法与加法运算


    PTA 02-线性结构2 一元多项式的乘法与加法运算

    题目描述

    设计函数分别求两个一元多项式的乘积与和。

    输入格式

    输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

    输出格式

    输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。

    输入输出样例

    输入样例#1
    4 3 4 -5 2  6 1  -2 0
    3 5 20  -7 4  3 1
    
    输出样例#1
    15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
    5 20 -4 4 -5 2 9 1 -2 0
    

    题目思路

    注意零多项式输出0 0,不用的动态空间要释放。

    #include<iostream>
    using namespace std;
    
    typedef struct node {
    	int a[2];
    	node* next;
    }node;
    
    void attach(int e, int c, node** rear)
    {
    	node* p = (node*)malloc(sizeof(node));
    	p->a[0] = e;
    	p->a[1] = c;
    	p->next = NULL;
    	(*rear)->next = p;
    	*rear = p;
    }
    
    node* add(node* p1, node* p2)
    {
    	node* p = (node*)malloc(sizeof(node));
    	p->next = NULL;
    	node* rear = p;
    	p1 = p1->next;
    	p2 = p2->next;
    	while (p1 && p2) {
    		if (p1->a[1] > p2->a[1]) {
    			attach(p1->a[0], p1->a[1], &rear);
    			p1 = p1->next;
    		}
    		else if (p1->a[1] < p2->a[1]) {
    			attach(p2->a[0], p2->a[1], &rear);
    			p2 = p2->next;
    		}
    		else {
    			if (p1->a[0] + p2->a[0])
    				attach(p1->a[0] + p2->a[0], p1->a[1], &rear);
    			p1 = p1->next;
    			p2 = p2->next;
    		}
    	}
    	while (p1) {
    		attach(p1->a[0], p1->a[1], &rear);
    		p1 = p1->next;
    	}
    	while (p2) {
    		attach(p2->a[0], p2->a[1], &rear);
    		p2 = p2->next;
    	}
    	return p;
    }
    
    node * mul(node* p1, int e, int c)
    {
    	int e1, c1;
    	node* p = (node*)malloc(sizeof(node));
    	node* rear = p;
    	//p1 = p1->next;
    	while (p1->next) {
    		e1 = p1->next->a[0] * e;
    		c1 = p1->next->a[1] + c;
    		if (e1 == 0 && c1 == 0) {
    			node* t = p1->next;
    			p1->next = t->next;
    			free(t);
    		}
    		else {
    			rear->next = (node*)malloc(sizeof(node));
    			rear->next->a[0] = e1;
    			rear->next->a[1] = c1;
    			rear->next->next = NULL;
    			rear = rear->next;
    			p1 = p1->next;
    		}
    	}
    	return p;
    }
    
    int main()
    {
    	int T, K, e, c;
    	node* nmul, * nadd,* tnmul,* fnmul;
    	node* rear1 = (node*)malloc(sizeof(node));
    	node* p1 = rear1;
    	node* rear2 = (node*)malloc(sizeof(node));
    	node* p2 = rear2;
    	cin >> T;
    	for (int i = 0; i < T; i++) {
    		cin >> e >> c;
    		attach(e, c, &rear1);
    	}
    	cin >> K;
    	for (int i = 0; i < K; i++) {
    		cin >> e >> c;
    		attach(e, c, &rear2);
    	}
    
    	nadd = add(p1, p2);
    	nmul = (node*)malloc(sizeof(node));
    	nmul->next = NULL;
    
    	for (node* tmp = p2->next; tmp; tmp = tmp->next)
    	{
    		tnmul = add(nmul,mul(p1, tmp->a[0], tmp->a[1]));
    		while (nmul) {
    			fnmul = nmul;
    			nmul = nmul->next;
    			free(fnmul);
    		}
    		nmul = tnmul;
    	}
    	
    	nmul = nmul -> next;
        if(!nmul)
            cout <<"0 0"<<endl;
    	else{
            while (nmul->next) {
                cout << nmul->a[0] << " " << nmul->a[1] << " ";
                nmul = nmul->next;
            }
            cout << nmul->a[0] << " " << nmul->a[1] << endl;
        }
        nadd = nadd->next;
    	if(!nadd)
            cout << "0 0"<<endl;
        else{
            while (nadd->next) {
                cout << nadd->a[0] << " " << nadd->a[1] << " ";
                nadd = nadd->next;
            }
            cout << nadd->a[0] << " " << nadd->a[1] << endl;
        }
    	return 0;
    }
    
  • 相关阅读:
    android raw与assets区别
    android 反编译
    sql 随笔
    控件EditText
    android 监听Home键
    android tab之间滑动切换界面功能
    android listview 总结
    SAP云平台上两个ABAP系统实例之间的互连
    什么是SAP OData Model Creator
    Netweaver和Windows,Ubuntu的数据共享
  • 原文地址:https://www.cnblogs.com/fsh001/p/13252221.html
Copyright © 2020-2023  润新知