XDOJ 133-一元稀疏多项式计算器

xdoj的一道四星题,原本是打算过两天做的,但是一个同学写了180行把这道题写完之后发了一个pyq,好巧不巧,让我看着了,我一看,欸,这题有点东西,我大意了啊,以为很难,没有写,这不花了一下午搞完了,也许方法不是很简单,但是确实只有100行,应该算是比较少的了,不为别的,就是要比我的那个同学写的短(请理解我不值一提的争胜心),废话说多了,接下来看题目

问题描述

一元 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+x^2+x^5

 

#include <stdio.h>

typedef struct function {
	int xi;
	int zhi;
} first[], second[], temp;

int main() {
	int n, m, t;
	scanf("%d %d %d", &n, &m, &t);
	function first[n * m], second[m], temp;
	int i, j;
	int cnt = 0, flag = 0, abc = 0;
	for (i = 0; i < n * m; i++) {//初始化
		first[i].xi = NULL;
		first[i].zhi = NULL;
	}
	for (i = 0; i < n; i++) {
		scanf("%d %d", &first[i].xi, &first[i].zhi);
	}
	for (j = 0; j < m; j++) {
		scanf("%d %d", &second[j].xi, &second[j].zhi);
		flag = 0;
		for (i = 0; i < n; i++) {
			if (first[i].zhi == second[j].zhi) {//如果有指数一样的就把系数相加
				if (t == 0) {//t=0是加法
					first[i].xi += second[j].xi;
				} else {//t=1是减法
					first[i].xi -= second[j].xi;
				}
				flag = 1; //标志
				break;
			}
		}
		if (flag == 0) { //如果没有指数一样的,就把second加到first后面
			if (t == 1) {
				first[n + j + 1].xi = -1 * second[j].xi;//系数是原来的相反数
				first[n + j + 1].zhi = second[j].zhi;
			} else {
				first[n + j + 1] = second[j];
			}
			cnt++;//那么就多出了一项
		}
//		printf("%d %d\n",first[i].xi,first[i].zhi);
	}
	//冒泡
//	printf("%d",cnt);
	for (i = 0; i < n + m; i++) {
		for (j = 0; j < n + m - i - 1; j++) {
			if (first[j].zhi > first[j + 1].zhi) {
				temp = first[j];
				first[j] = first[j + 1];
				first[j + 1] = temp;
			}
		}
	}

	//输出
//	for (i = 0; i <= n + m; i++) {
//		printf("%d %d\n", first[i].xi, first[i].zhi);
//	}
	//第一项单独计算
	if (first[0].xi != 0 && first[0].zhi == 0) {//第一项为数字
		printf("%d", first[0].xi);
		abc = 1;//abc=1就证明第一项输出了,就可以加‘+’了
	} else if (first[0].xi != 0 && first[0].zhi != 0 && first[0].zhi != 1 && first[0].zhi != -1) { //常规情况
		printf("%dx^%d", first[0].xi, first[0].zhi);
		abc = 1;
	} else if (first[0].xi != 0 && first[0].zhi == 1) {//指数是1的情况
		printf("%x", first[0].xi);
		abc = 1;
	} else if (first[0].xi != 0 && first[0].zhi == -1) {//指数是-1的情况
		printf("-x^-1", first[0].xi);
		abc = 1;
	}
	//从第二项起
	for (i = 1; i <= n + m; i++) {
		if (first[i].xi == 0)//系数是0不输出
			continue;
		else if (first[i].xi > 0 && first[i].zhi != 0 && abc == 1)//系数大于0,指数不为0且第一项已输出
			printf("+");
		abc = 1;
		if (first[i].xi != 1 && first[i].xi != -1 && first[i].zhi != 1 && first[i].zhi != 0)//常规情况
			printf("%dx^%d", first[i].xi, first[i].zhi);
		else if (first[i].xi == 1 && first[i].zhi != 1 && first[i].zhi != 0 )//系数是1,指数不为0,1
			printf("x^%d", first[i].zhi);
		else if (first[i].xi == -1 && first[i].zhi != 1 && first[i].zhi != 0)//系数是-1,指数不为0,1
			printf("-x^%d", first[i].zhi);
		else if (first[i].xi != 1 && first[i].xi != -1 && first[i].zhi == 1)//系数不为1,-1,指数为1
			printf("%dx", first[i].xi, first[i].zhi);
		else if (first[i].xi == 1 && first[i].zhi == 1)//系数是1,指数是1
			printf("x", first[i].zhi);
		else if (first[i].xi == -1 && first[i].zhi == 1)//系数是-1,指数是1
			printf("-x", first[i].zhi);
		else if (first[i].zhi == 0)//指数是0,就直接输出系数
			printf("%d", first[i].xi);
	}
	return 0;
}

欢迎各位大佬前来指正我的不足。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值