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;
}
欢迎各位大佬前来指正我的不足。