6、一元多项式的乘法与加法运算(线性表实现方法)

前言

  真的醉了,写了一个下午。一开始感觉题目离不了数据的调用,因此使用了线性表的方法,写的时候那叫一个折磨。但我认为我提供了一个不同于链表的方法,还是打算分享给大家。我是伞兵

题目

设计函数分别求两个一元多项式的乘积与和。
在这里插入图片描述
  题目真的很抽象,我们这样理解。

第一行   4  3x4-5x2+6x1-2x0
第二行   3  5x20-7x4+3x1
把两个多项式相乘,相加,输出类似的结果。如果相乘或相加后是0,输出0 0。

代码分析

主函数

#include<stdio.h>
#include<stdlib.h>
#define MAX 1001
typedef struct LNode* List;
struct LNode
{
	int num;//存这个多项式个数
	int Data[MAX];//存多项式的数字部分
	int Index[MAX];//存多项式的指数部分
};
void multiply(List M1, List M2);//乘法,M1和M2是输入的两个多项式
void add(List M1, List M2);//加法
//线性表的数据插入,X是数字,Y是指数,K是插入位置
void Insert(List ad, int X, int Y, int K);
int main()
{
	//定义2个线性表
	int i;
	List M1, M2;
	M1 = (List)malloc(sizeof(struct LNode));
	M2 = (List)malloc(sizeof(struct LNode));
	//输入表达式
	scanf("%d", &M1->num);
	for (i = 0; i < M1->num; i++)
	{
		scanf("%d", &M1->Data[i]);
		scanf("%d", &M1->Index[i]);
	}
	scanf("%d", &M2->num);
	for (i = 0; i < M2->num; i++)
	{
		scanf("%d", &M2->Data[i]);
		scanf("%d", &M2->Index[i]);
	}
	multiply(M1, M2);//输出乘法的结果
	add(M1, M2);//输出加法结果
	return 0;
}

乘法函数
  方法有些复杂,但好理解。我们用M1的第一个项、第二个项……分别乘以M2第一个项,再分别乘以M2第二个项……输出所有的结果到新的线性表mul中。

  考虑到排在后面的指数更大的情况,所以我们对输出的线性表从大到小排序。

  之后遍历线性表,把相同指数的项加起来,如果加起来后数字为0,就删除这一项。

void multiply(List M1, List M2)
{
	List mul,realmul;//real就是排序后的线性表
	mul = (List)malloc(sizeof(struct LNode));
	realmul = (List)malloc(sizeof(struct LNode));
	int i, j;
	int maxData, maxIndex;
	mul->num = 0;
	//得到所有相乘的结果
	for (j = 0; j < M2->num; j++)
	{
		for (i = 0; i < M1->num; i++)
		{
			mul->Data[mul->num] = M1->Data[i] * M2->Data[j];
			mul->Index[mul->num] = M1->Index[i] + M2->Index[j];
			mul->num++;
		}
	}
	//使用冒泡法排序
	for (i = 0; i < mul->num; i++)
	{
		for (j = 1; j < mul->num; j++)
		{
			if (mul->Index[j - 1] < mul->Index[j])
			{
				maxIndex = mul->Index[j];
				maxData = mul->Data[j];
				mul->Index[j] = mul->Index[j - 1];
				mul->Data[j] = mul->Data[j - 1];
				mul->Index[j - 1] = maxIndex;
				mul->Data[j - 1] = maxData;
			}
		}
	}//排序结束
	//相同项相加
	realmul->Data[0] = mul->Data[0];
	realmul->Index[0] = mul->Index[0];
	for (i = 1, j = 0; i < mul->num; i++)
	{
	    //原理就是排序后相同指数排在一起
	    //所以如果上一个和当前的指数相同,就相加。
		if (mul->Index[i] == mul->Index[i - 1])
		{
			realmul->Data[j] += mul->Data[i];
			if (realmul->Data[j] == 0)//防止合并出现0
				j--;
		}
		else//不相同就顺序放入
		{
			j++;
			realmul->Data[j] = mul->Data[i];
			realmul->Index[j] = mul->Index[i];
		}
	}
	realmul->num = j + 1;
	//最后没有数据,就输出0 0
	if (realmul->num == 0)
		printf("0 0");
	//输出结果
	else
	{
		printf("%d %d", realmul->Data[0], realmul->Index[0]);
	for (i = 1; i < realmul->num; i++)
		printf(" %d %d", realmul->Data[i], realmul->Index[i]);
	printf("\n");
	}
	return;
}

加法函数、插入函数
  我采用的方法是逐个添加的方法。首先我们把M1复制到ad中,然后把M2中每个指数来比较。如果大于,就插入到前面,如果等于,就把该指数对应的系数相加,如果小于,就继续和下一个比较。比较完后,如果M2没有完全输出,此时再把M2依此插入最后面。

void add(List M1, List M2)
{
	List ad;
	ad = (List)malloc(sizeof(struct LNode));
	ad->num = 0;
	int i = 0, j = 0;
	//复制M1
	for (i = 0; i < M1->num; i++)
	{
		ad->Data[i] = M1->Data[i];
		ad->Index[i] = M1->Index[i];
		ad->num++;
	}
	//M2开始比较
	for (i = 0; i < ad->num; i++)
	{
		if (M2->Index[j] > ad->Index[i])
		{
			Insert(ad, M2->Data[j], M2->Index[j], i);
			j++;
		}
		else if (M2->Index[j] == ad->Index[i])
		{
			ad->Data[i] += M2->Data[j];
			if (ad->Data[i] == 0)
			{
				for (int k = i; k < ad->num - 1; k++)
				{
					ad->Data[k] = ad->Data[k + 1];
					ad->Index[k] = ad->Index[k + 1];
				}
				ad->num--;
				i--;
			}
			j++;
		}
	}
	//如果结果没有输出完,依次插入
	for (j; j < M2->num; j++)
	{
		ad->Data[ad->num] = M2->Data[j];
		ad->Index[ad->num] = M2->Index[j];
		ad->num++;
	}
	//输出结果
	if (ad->num == 0)
		printf("0 0");
	else
	{
		printf("%d %d", ad->Data[0], ad->Index[0]);
		for (i = 1; i < ad->num; i++)
			printf(" %d %d", ad->Data[i], ad->Index[i]);
	}
	return;
}
//插入函数
//依次把K后面的数往后挪一位,之后把需要添加的东西放在K的位置上。
void Insert(List ad, int X, int Y, int K)
{

	int i;
	for (i = ad->num - 1; i >= K; i--)
	{
		ad->Data[i + 1] = ad->Data[i];
		ad->Index[i + 1] = ad->Index[i];
	}
	ad->num++;
	i++;
	ad->Data[i] = X;
	ad->Index[i] = Y;
	return;
}

代码实现

#include<stdio.h>
#include<stdlib.h>
#define MAX 1001
typedef struct LNode* List;
struct LNode
{
	int num;//存数量
	int Data[MAX];
	int Index[MAX];
};
void multiply(List M1, List M2);
void add(List M1, List M2);
void Insert(List ad, int X, int Y, int K);
int main()
{
	//定义4个线性表
	int i;
	List M1, M2;
	M1 = (List)malloc(sizeof(struct LNode));
	M2 = (List)malloc(sizeof(struct LNode));
	scanf("%d", &M1->num);
	for (i = 0; i < M1->num; i++)
	{
		scanf("%d", &M1->Data[i]);
		scanf("%d", &M1->Index[i]);
	}
	scanf("%d", &M2->num);
	for (i = 0; i < M2->num; i++)
	{
		scanf("%d", &M2->Data[i]);
		scanf("%d", &M2->Index[i]);
	}
	multiply(M1, M2);
	add(M1, M2);
	return 0;
}
void multiply(List M1, List M2)
{
	List mul,realmul;//把乘的结果放入此线性表中
	mul = (List)malloc(sizeof(struct LNode));
	realmul = (List)malloc(sizeof(struct LNode));
	int i, j;
	int maxData, maxIndex;
	mul->num = 0;
	for (j = 0; j < M2->num; j++)
	{
		for (i = 0; i < M1->num; i++)
		{
			mul->Data[mul->num] = M1->Data[i] * M2->Data[j];
			mul->Index[mul->num] = M1->Index[i] + M2->Index[j];
			mul->num++;
		}
	}
	for (i = 0; i < mul->num; i++)
	{
		for (j = 1; j < mul->num; j++)
		{
			if (mul->Index[j - 1] < mul->Index[j])
			{
				maxIndex = mul->Index[j];
				maxData = mul->Data[j];
				mul->Index[j] = mul->Index[j - 1];
				mul->Data[j] = mul->Data[j - 1];
				mul->Index[j - 1] = maxIndex;
				mul->Data[j - 1] = maxData;
			}
		}
	}//排序结束

	realmul->Data[0] = mul->Data[0];
	realmul->Index[0] = mul->Index[0];
	for (i = 1, j = 0; i < mul->num; i++)
	{
		if (mul->Index[i] == mul->Index[i - 1])
		{
			realmul->Data[j] += mul->Data[i];
			if (realmul->Data[j] == 0)//防止合并出现0
				j--;
		}
		else
		{
			j++;
			realmul->Data[j] = mul->Data[i];
			realmul->Index[j] = mul->Index[i];
		}
	}
	realmul->num = j + 1;
	if (realmul->num == 0)
		printf("0 0");
	else
	{
		printf("%d %d", realmul->Data[0], realmul->Index[0]);
	for (i = 1; i < realmul->num; i++)
		printf(" %d %d", realmul->Data[i], realmul->Index[i]);
	printf("\n");
	}
	return;
}

void add(List M1, List M2)
{
	List ad;
	ad = (List)malloc(sizeof(struct LNode));
	ad->num = 0;
	int i = 0, j = 0;
	for (i = 0; i < M1->num; i++)
	{
		ad->Data[i] = M1->Data[i];
		ad->Index[i] = M1->Index[i];
		ad->num++;
	}
	for (i = 0; i < ad->num; i++)
	{
		if (M2->Index[j] > ad->Index[i])
		{
			Insert(ad, M2->Data[j], M2->Index[j], i);
			j++;
		}
		else if (M2->Index[j] == ad->Index[i])
		{
			ad->Data[i] += M2->Data[j];
			if (ad->Data[i] == 0)
			{
				for (int k = i; k < ad->num - 1; k++)
				{
					ad->Data[k] = ad->Data[k + 1];
					ad->Index[k] = ad->Index[k + 1];
				}
				ad->num--;
				i--;
			}
			j++;
		}
	}
	for (j; j < M2->num; j++)
	{
		ad->Data[ad->num] = M2->Data[j];
		ad->Index[ad->num] = M2->Index[j];
		ad->num++;
	}
	if (ad->num == 0)
		printf("0 0");
	else
	{
		printf("%d %d", ad->Data[0], ad->Index[0]);
		for (i = 1; i < ad->num; i++)
			printf(" %d %d", ad->Data[i], ad->Index[i]);
	}
	return;
}

void Insert(List ad, int X, int Y, int K)
{

	int i;
	for (i = ad->num - 1; i >= K; i--)
	{
		ad->Data[i + 1] = ad->Data[i];
		ad->Index[i + 1] = ad->Index[i];
	}
	ad->num++;
	i++;
	ad->Data[i] = X;
	ad->Index[i] = Y;
	return;
}

在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值