问题描述
一元 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;
}