一元稀疏多项式计算器
问题描述
一元 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
简单的说一下值得注意的一些我的见解吧
首先,这道题算是比较麻烦但是思路简单的一类题,主要麻烦在打印哪里。
在最开始,我完全没有想到指数可以为负数,然后就郁闷了好久……毕竟,码代码两分钟,剩下全是找BUG……
于是,就写了一些奇怪的代码(没有考虑负指数),我把它注释并贴在文章末尾来公开处刑;
当我在偶然机会(其实就是气的开始砸键盘),误打误撞输入了负数之后,新的世界打开了。于是有了正确的代码,但是自觉打印流程复杂,希望各位学习的朋友能够帮忙改进(好吧,其实就是我懒得再想了……)
如果你错了,请考虑以下要点:
- 指数是否负数
- 多项式合并全部为0是否考虑
- 首项为正数时是否含‘+’
- 是否输出常数0而多此一举
- 对于指数为0,-1,1的考虑,以及系数为0,-1,1的处理
#include<stdio.h>
int main()
{
/**************************函数参数********************************************
*xfir: 多项式1的长
*xsec: 多项式2的长
*xchang: 运算方式
* struct pol 结构体pol:
{
int index; index:表示指数
int coe; coe:表示系数
};
*i,j,k,l 表示临时值
*fir[xfir+xsec],sec[xsec] 分别表示第一、二个多项式
*flag 标志是否多项式为常量0
*******************************************************************************/
int xfir,xsec,xchang,flag;
struct pol
{
int index;
int coe;
};
/*输入*/
scanf("%d%d%d",&xfir,&xsec,&xchang);
int i,j,k,l;
struct pol fir[xfir+xsec],sec[xsec];
for(i=0;i<xfir;i++)
scanf("%d%d",&fir[i].coe,&fir[i].index);
for(j=0;j<xsec;j++)
scanf("%d%d",&sec[j].coe,&sec[j].index);
flag=0;
/*合并同类项*/
if(xchang==0){
/*在第一个数组中浏览第二个数组*/
for(i=0;i<xfir;i++)
for(j=0;j<xsec;j++)
if(fir[i].index==sec[j].index){
fir[i].coe=fir[i].coe+sec[j].coe;
sec[j].coe=0;
}
/*将第二个数组剩余的项放进第一个数组之中*/
for(j=0;j<xsec;j++){
if(sec[j].coe==0);
else{
fir[i].coe=sec[j].coe;
fir[i].index=sec[j].index;
i++;
}
}
}
else if(xchang==1){
for(i=0;i<xfir;i++)
for(j=0;j<xsec;j++)
if(fir[i].index==sec[j].index){
fir[i].coe=fir[i].coe-sec[j].coe;
sec[j].coe=0;
}
for(j=0;j<xsec;j++){
if(sec[j].coe==0);
else{
fir[i].coe=-sec[j].coe;
fir[i].index=sec[j].index;
i++;
}
}
}
//i此时很重要,或者可以令一个变量记录此时的值
/*排序,按照指数大小排序*/
for(j=0;j<i-1;j++)
for(k=j;k<i;k++){
if(fir[j].index>fir[k].index){
l=fir[j].index;
fir[j].index=fir[k].index;
fir[k].index=l;
l=fir[j].coe;
fir[j].coe=fir[k].coe;
fir[k].coe=l;
}
}
/*打印【系数为1,指数为1,系数为0,指数为0.这些都需要单独考虑】*/
for(j=0;j<i;j++){
if(fir[j].coe==0)
flag++; //系数为0 以下系数均不会为0
else if(fir[j].index==0){ //指数为0
if(j==0)
printf("%d",fir[j].coe);
else
printf("%+d",fir[j].coe);
}
else if(fir[j].index==1){ //指数为1
if(fir[j].coe==1){
if(j==0)
printf("x");
else
printf("+x");
}
else if(fir[j].coe==-1){
printf("-x");
}
else{
if(j==0)
printf("%dx",fir[j].coe);
else
printf("%+dx",fir[j].coe);
}
}
else if(fir[j].index==-1){ //指数为-1
if(fir[j].coe==1){
if(j==0)
printf("x^-1");
else
printf("+x^-1");
}
else if(fir[j].coe==-1){
printf("-x^-1");
}
else{
if(j==0)
printf("%dx^-1",fir[j].coe);
else
printf("%+dx^-1",fir[j].coe);
}
}
else{ //系数不为0;指数不为0;+1;-1;
if(fir[j].coe==1){
if(j==0)
printf("x^%d",fir[j].index);
else
printf("+x^%d",fir[j].index);
}
else if(fir[j].coe==-1){
printf("-x^%d",fir[j].index);
}
else{
if(j==0)
printf("%dx^%d",fir[j].coe,fir[j].index);
else
printf("%+dx^%d",fir[j].coe,fir[j].index);
}
}
}
if(flag==i) // 判断是否相互抵消为0;
printf("0");
return 0;
}
@ RoboMaster!十兮
公开处刑的代码:
//#include<stdio.h>
//int main()
//{
///**************************函数参数********************************************
//*xfir: 数组fir[100]长度一半
//*xsec: 数组sec[100]长度一半
//*xchang: 状态值
//*fir[100]: 第一个多项式
//*sec[100]: 第二个多项式
//*******************************************************************************/
// int xfir,xsec,xchang;
// int fir[100],sec[100];
// /*输入*/
// scanf("%d%d%d",&xfir,&xsec,&xchang);
// if(xfir>=xsec) {
// for(int i=0;i<2*xfir;i++)
// scanf("%d",&fir[i]);
// for(int i=0;i<2*xsec;i++)
// scanf("%d",&sec[i]);
// /*将多项式系数合并*/
// for(int i=0;i<xfir;i++)
// for(int j=0;j<xsec;j++)
// if(fir[2*i+1]==sec[2*j+1])
// fir[2*i]=fir[2*i]+sec[2*j];
// }
// else{
// for(int i=0;i<2*xfir;i++)
// scanf("%d",&sec[i]);
// for(int i=0;i<2*xsec;i++)
// scanf("%d",&fir[i]);
// for(int i=0;i<xsec;i++)
// for(int j=0;j<xfir;j++)
// if(fir[2*i+1]==sec[2*j+1])
// fir[2*i]=fir[2*i]+sec[2*j];
// xfir=xsec;
// }
// /*打印*/
// printf("%d",fir[0]);
// if(xchang==0){
// for(int i=1;i<xfir;i++)
// if(fir[2*i]>0){ //系数大于0 ,后面同理
// if(fir[2*i]!=1&&fir[2*i+1]!=1) //系数为1,后面同理
// printf("%+dx^%d",fir[2*i],fir[2*i+1]);
// else if(fir[2*i]!=1&&fir[2*i+1]==1)
// printf("%+dx",fir[2*i]);
// else if(fir[2*i]==1&&fir[2*i+1]!=1)
// printf("+x^%d",fir[2*i+1]);
// else if(fir[2*i]==1&&fir[2*i+1]==1)
// printf("+x");
// }
// else if(fir[2*i]<0){
// if(fir[2*i]!=-1&&fir[2*i+1]!=1)
// printf("%+dx^%d",fir[2*i],fir[2*i+1]);
// else if(fir[2*i]!=-1&&fir[2*i+1]==1)
// printf("%+dx",fir[2*i]);
// else if(fir[2*i]==-1&&fir[2*i+1]!=1)
// printf("-x^%d",fir[2*i+1]);
// else if(fir[2*i]==-1&&fir[2*i+1]==1)
// printf("-x");
// }
// }
// else if(xchang==1)
// for(int i=1;i<xfir;i++)
// if(fir[2*i]>0){ //系数大于0 ,后面同理
// if(fir[2*i]!=1&&fir[2*i+1]!=1) //系数为1,后面同理
// printf("-%dx^%d",fir[2*i],fir[2*i+1]);
// else if(fir[2*i]!=1&&fir[2*i+1]==1)
// printf("-%dx",fir[2*i]);
// else if(fir[2*i]==1&&fir[2*i+1]!=1)
// printf("-x^%d",fir[2*i+1]);
// else if(fir[2*i]==1&&fir[2*i+1]==1)
// printf("-x");
// }
// else if(fir[2*i]<0){
// if(fir[2*i]!=-1&&fir[2*i+1]!=1)
// printf("+%dx^%d",-fir[2*i],fir[2*i+1]);
// else if(fir[2*i]!=-1&&fir[2*i+1]==1)
// printf("+%dx",-fir[2*i]);
// else if(fir[2*i]==-1&&fir[2*i+1]!=1)
// printf("+x^%d",fir[2*i+1]);
// else if(fir[2*i]==-1&&fir[2*i+1]==1)
// printf("+x");
// }
//
// return 0;
// }
//未考虑负数指数
@ RoboMaster!十兮
感谢阅读,刚开始学习C语言,理解尚浅,若有不足,欢迎指正^ _ ^