数据结构 习题3.6 一元多项式的乘法与加法运算

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

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

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

输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 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

2020.3.6 数据库学习

(deque,sort,for_each,.begin和.end以及遍历条件size(也就是链表大小)的学习使用)

#include<bits/stdc++.h>
using namespace std;
struct Node{
	int zi;
	int xi;
};
deque<Node>a,b,c,d;								//deque是创建一个容器的意思,也就是双向链表(队列),使用方法如这 
bool haveflag=false;
bool firstflag=true;
void print(Node t)								//for_each自动传入容器第一个参数,简单无比,夷虏最畏者也!!!! 
{
	if(t.xi==0)
	return;										//如果系数为0,则不输出 
	haveflag=true;
	if(firstflag)								//如果是第一个的话的意思 
	{
		cout<<t.xi<<" "<<t.zi;					
		firstflag=false;
	}
	else
	cout<<" "<<t.xi<<" "<<t.zi;
}
bool cmp(Node t1,Node t2)						//这里的意思是t1>t2,即告诉函数应该从大到小排列 
{
	if(t1.zi>t2.zi)
	return true;
	return false;
}
int main()
{
	int i,j;
	int n;
	cin>>n;
	while(n--)
	{
		Node t;
		cin>>t.xi>>t.zi;
		a.push_back(t);												//push_back会将t塞入a中,以后可以用它取代push操作 
	}
	cin>>n;
	while(n--)
	{
		Node t;
		cin>>t.xi>>t.zi;
		b.push_back(t);	
		d.push_back(t);
	}
	for(i=0;i<a.size();++i)											//size明显是指容器a的大小 
	{
		Node t;
		int j;
		for(j=0;j<b.size();++j)
		{
			t.xi=a[i].xi*b[j].xi;
			t.zi=a[i].zi+b[j].zi;
			int k;
			bool flag=true;
			for(k=0;k<c.size();++k)
			{
				if(c[k].zi==t.zi)
				{
					c[k].xi+=t.xi;
					flag=false;
				}
			}
			if(flag)
			c.push_back(t);
		}
		bool flag1=true;
		for(j=0;j<d.size();++j)
		{
			if(d[j].zi==a[i].zi)
			{
				d[j].xi+=a[i].xi;
				flag1=false;
			}
		}
		if(flag1)
		d.push_back(a[i]);
	}
	sort(c.begin(),c.end(),cmp);											//sort函数可以进行全排列,第三个参数可以作为大小排列的标准 
	for_each(c.begin(),c.end(),print);										//for_each可以将容器从头到尾循环一遍,前两个为头和尾,第三个为执行句 
	if(!haveflag)
	cout<<"0 0";
	cout<<endl;
	firstflag=true;
	haveflag=false;
	sort(d.begin(),d.end(),cmp);											//begin end非常好用,因为这样子可以直接确定头和尾,不再需要储存 
	for_each(d.begin(),d.end(),print);										//注意,这里的foreach同时将第一个作为参数传入print函数中 
	if(!haveflag)
	cout<<"0 0";
	cout<<endl;
	return 0;
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
表如下: ``` typedef struct node { float coef; // 系数 int expn; // 次数 struct node *next; // 指向下一个节点的指针 } Node, *Polynomial; ``` 其中,`Node` 表示一个节点,`Polynomial` 表示一个多项式,即由多个节点组成的链表。链表中每个节点存储一个单项式,由系数 `coef` 和指数 `expn` 组成。链表的头节点不存储任何单项式,其 `coef` 和 `expn` 值可以随意设置。 下面是一元多项式加法运算代码: ```c Polynomial add(Polynomial p1, Polynomial p2) { Polynomial head = (Polynomial) malloc(sizeof(Node)); // 头节点 head->next = NULL; Polynomial tail = head; // 尾节点 while (p1 && p2) { if (p1->expn == p2->expn) { // 指数相同 float sum = p1->coef + p2->coef; if (sum != 0) { // 系数之和不为0 Polynomial temp = (Polynomial) malloc(sizeof(Node)); temp->coef = sum; temp->expn = p1->expn; temp->next = NULL; tail->next = temp; tail = temp; } p1 = p1->next; p2 = p2->next; } else if (p1->expn > p2->expn) { // p1 的指数大于 p2 的指数 Polynomial temp = (Polynomial) malloc(sizeof(Node)); temp->coef = p1->coef; temp->expn = p1->expn; temp->next = NULL; tail->next = temp; tail = temp; p1 = p1->next; } else { // p1 的指数小于 p2 的指数 Polynomial temp = (Polynomial) malloc(sizeof(Node)); temp->coef = p2->coef; temp->expn = p2->expn; temp->next = NULL; tail->next = temp; tail = temp; p2 = p2->next; } } while (p1) { // 将 p1 中剩余的单项式加入结果多项式中 Polynomial temp = (Polynomial) malloc(sizeof(Node)); temp->coef = p1->coef; temp->expn = p1->expn; temp->next = NULL; tail->next = temp; tail = temp; p1 = p1->next; } while (p2) { // 将 p2 中剩余的单项式加入结果多项式中 Polynomial temp = (Polynomial) malloc(sizeof(Node)); temp->coef = p2->coef; temp->expn = p2->expn; temp->next = NULL; tail->next = temp; tail = temp; p2 = p2->next; } return head; } ``` 下面是一元多项式乘法运算代码: ```c Polynomial multiply(Polynomial p1, Polynomial p2) { Polynomial head = (Polynomial) malloc(sizeof(Node)); // 头节点 head->next = NULL; while (p1) { Polynomial temp_head = (Polynomial) malloc(sizeof(Node)); // 暂存结果多项式的头节点 temp_head->next = NULL; Polynomial temp_tail = temp_head; // 暂存结果多项式的尾节点 while (p2) { Polynomial temp = (Polynomial) malloc(sizeof(Node)); // 创建新节点 temp->coef = p1->coef * p2->coef; temp->expn = p1->expn + p2->expn; temp->next = NULL; temp_tail->next = temp; // 添加到结果多项式中 temp_tail = temp; p2 = p2->next; } head = add(head, temp_head->next); // 将暂存结果多项式与当前结果多项式相加 p1 = p1->next; } return head; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值