XDOJ-133-一元稀疏多项式

问题描述
一元 n 次多项式𝑝0𝑋𝑒0 + 𝑝1𝑋𝑒1 + ⋯ + 𝑝𝑖𝑋𝑒𝑖 + ⋯ + 𝑝𝑛𝑋𝑒𝑛 项数较少时成为一元稀疏多项式,
例如:3 + 6𝑋3 − 2𝑋8 + 12𝑋20是一个一元稀疏多项式。设计一个一元稀疏多项式计算器程
序完成两个一元稀疏多项式的加减法,输出结果多项式的各项系数和指数。
输入说明
输入数据第 1 行为 3 个正整数 n,m,t。其中 n 表示第一个多项式的项数,m 表示第二个
多项式的项数,t 表示运算类型,0 为加法,1 为减法。数据的第 2 行包含 2n 个整数,每两
个整数分别表示第一个多项式每一项的系数和指数;第 3 行包含 2m 个整数,每两个整数分
别表示第二个多项式每一项的系数和指数。两个多项式的每项是按照指数递增的形式给出的,
例如对于多项式3 + 6𝑋3 − 2𝑋8 + 12𝑋20,对应的输入为 3 0 6 3 -2 8 12 20
输出说明
运算结果按指数从低到高的顺序在以多项式形式(见输出样例)输出结果,注意系数为负数
时输出减号,系数为 0 时不输出该项,指数为 1 时不输出指数。
输入样例
6 2 0
1 0 1 1 1 2 1 3 1 4 1 5
-1 3 -1 4
输出样例
1+x+x2+x5

思路:
多项式的每一项用结构体保存,运用结构体数组保存多项式。

思路虽然是清晰的,但过程中遇到的问题却比较多,导致花了很长时间找代码中的不足之处:
卡顿点1:在输出运算结果时,每一项的指数与系数都有其特殊情况,同时第一项的系数如果为正则不输出正号,个人能力有限导致其分类繁杂。
卡顿点2:虽然代码很长,但加法减法以及输出的逻辑是一样的。这也导致在复制粘贴时有很小的地方没有修改到位。

提交的结果不是满分时,我甚至一度以为是可能有输入的多项式有同类项的情况。对运算的结果做了同类项的处理。当然在oj看来是徒劳的。

注:%+d输出为+1,-1

#include <stdio.h>
//多项式:polnomial 
//系数:coefficient
//指数:index 
struct polnomial {//一个多项式中的一个因子 
	int coe;
	int index; 
}; 
int main(void)
{	
	int n, m, t;//n项,m项,t指代加减法
	scanf("%d %d %d", &n, &m, &t);
	int i, j; //计数器
	int flag, k; //判断器, k用于记录多项式2相加的位置 
	struct polnomial po1[n], po2[m];//多项式1和多项式2
	struct polnomial res[n + m];	//运算结果 
	struct polnomial temp;
	
	for (i = 0; i < n; i++)//输入多项式1
	{//同时多项式1输入进res中
		scanf("%d %d", &po1[i].coe, &po1[i].index);
		res[i].coe = po1[i].coe, res[i].index = po1[i].index;
	}
	for (i = 0; i < m; i++)//输入多项式2
		scanf("%d %d", &po2[i].coe, &po2[i].index);
	
	k = n;
	if (t == 0)//加法运算 
	{
		for (i = 0; i < m; i++)//将多项式2加入res中 
		{//首先遍历res是否有指数相同的项 
			flag = 1;
			for (j = 0; j < n; j++)
			{
				if (res[j].index == po2[i].index)
				{
					res[j].coe += po2[i].coe;
					flag = 0;//表明po2的这一项在res中有对应的项
					break; 
				}
			}//遍历res数组完毕,若有则flag = 0, 无则为1
			if (flag)//res无与po2相同的项,将这一项加入进res的后面 
			{
				res[k] = po2[i];
				k++;
			}
		}
	}
	else//将加法运算复制粘贴改加减号
	{
		for (i = 0; i < m; i++)//将多项式2加入res中 
		{//首先遍历res是否有指数相同的项 
			flag = 1;
			for (j = 0; j < n; j++)
			{
				if (res[j].index == po2[i].index)
				{
					res[j].coe -= po2[i].coe;
					flag = 0;//表明po2的这一项在res中有对应的项
					break; 
				}
			}//遍历res数组完毕,若有则flag = 0, 无则为1
			if (flag)//res无与po2相同的项,将这一项加入进res的后面 
			{
				res[k].coe = 0 - po2[i].coe;
				res[k].index = po2[i].index;
				k++;
			}
		}
	}
//	for (i = 0; i < k; i++)
//		printf("%+d x^ %d\n", res[i].coe, res[i].index)
	for (i = 0; i < k; i++)//对res以指数从低到高进行排序 
	{
		for (j = 0; j < k - i - 1; j++)
		{
			if (res[j].index > res[j + 1].index)
			{
				temp = res[j];
				res[j] = res[j + 1];
				res[j + 1] = temp;
			}
		}
	}
	
	//输出结果
	for (i = 0; i < k; i++)
	{//第一项系数如果为正,则不带正号
	 //首先输出第一项,则后续的输出不必再判断是否是第一项 
	 	if (res[i].coe == 0)
	 		continue;
	 	if (res[i].index == 0)//指数等于0 
	 	{
	 		printf("%d", res[i].coe);
	 		break;
		}
	 	else if (res[i].index == 1)//指数等于1 
	 	{//系数的特殊情况有1,-1,且第一项的系数不能有正号 
	 		if (res[i].coe == 1)
	 		{
	 			printf("x");
	 			break;
			}
			else if (res[i].coe == -1)
			{
				printf("-x");
				break;
			}
			else
			{
				printf("%dx", res[i].coe); 
				break; 
			}
		}
		else//指数既不等于0也不等于1 
		{
			if (res[i].coe == 1)
	 		{
	 			printf("x^%d", res[i].index);
	 			break;
			}
			else if (res[i].coe == -1)
			{
				printf("-x%d", res[i].index);
				break;
			}
			else
			{
				printf("%dx^%d",res[i].coe, res[i].index); 
				break; 
			}
		}
	}
	i++;
	for (i; i < k; i++)
	{//修改输出第一项的循环,去掉break,将系数%d改为%+d 
	 	if (res[i].coe == 0)
	 		continue;
	 	if (res[i].index == 0)//指数等于0 
	 		printf("%+d", res[i].coe);
	 	else if (res[i].index == 1)//指数等于1 
	 	{//系数的特殊情况有1,-1,且第一项的系数不能有正号 
	 		if (res[i].coe == 1)
	 			printf("+x");
			else if (res[i].coe == -1)
				printf("-x");
			else
				printf("%+dx", res[i].coe); 
		}
		else//指数既不等于0也不等于1 
		{
			if (res[i].coe == 1)
	 			printf("+x^%d", res[i].index);
			else if (res[i].coe == -1)
				printf("-x^%d", res[i].index); 
			else
				printf("%+dx^%d", res[i].coe, res[i].index); 
		}
	}
		
	return 0;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一元稀疏多项式计算器是一个使用C语言编写的程序,用于进行一元稀疏多项式的计算。 该计算器的输入是一个一元稀疏多项式,包含多个项,每个项由系数和幂次组成。在C语言中,可以使用结构体来表示每个项,例如定义一个结构体PolynomialTerm,包含两个成员变量:coeff用于表示系数,exponent用于表示幂次。 计算器通过以下步骤来进行计算: 1. 首先,程序会要求用户输入一元稀疏多项式的项数n。 2. 然后,程序会使用一个循环,让用户逐个输入每个项的系数和幂次,并将这些数据保存到一个数组或链表中。在循环中,使用scanf函数读取用户输入的数据,并将数据存储到PolynomialTerm结构体的成员变量中。 3. 输入完所有项后,程序会根据用户的选择进行相应的操作,例如计算多项式的和、差、积等。可以使用一个switch语句来根据用户的选择执行相应的操作。 4. 在计算和、差、积等操作时,程序将遍历保存多项式数据的数组或链表,并根据每个项的系数和幂次,进行相应的计算。可以使用for循环来遍历数组或链表中的每一个项。 5. 最后,程序会输出计算结果,并询问用户是否要继续进行其他计算。可以使用printf函数来输出结果,使用scanf函数来接收用户的选择。 总的来说,一元稀疏多项式计算器是通过用户输入一元稀疏多项式的项数和每个项的系数和幂次,进行相应的计算并输出结果的程序。它使用C语言编写,运用了结构体、循环和条件语句等基本编程概念来实现功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值