本文主要是介绍XDOJ-一元稀疏多项式计算器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一元稀疏多项式计算器
要变得更强。
————更新————
下面同学说的问题我改正啦。
没改之前:
可以看到多了个负号,是因为在这个结构体里面,第一项就是0,因此会跳过打印多项式对fooo[0]的求解,所以会多一项负号。
因此我选择用for循环来找到第一项不是0的就可以啦。
改后:
——————————
这个问题怎么说,一个上午就这么过去了。果然不愧是小白:(
一开始我还想用三个数组,一个存第一个,一个存第二个,再把结果存到另外一个数组里面。
不过很明显,非常麻烦,当给我把代码码出来时,得到的结果也很离谱。然后……然后我就几乎全部重改了。
然后缩减至两个数组,将无论加减都放在一个数组里。
再将结果放进另外一个数组里。
需要考虑的点:
1.关于系数为0 ,1,-1
2.关于幂次为0,1
3.如果和为0(使用count来计数)
问题描述
一元 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{struct{int ratio,power;}items;
}POLYNOMIA;int main(){POLYNOMIA f[1000],fooo[1000];int n,m,t,i,j,temp1,temp2,ra,po;int count=1,k=0,sum=0;scanf("%d %d %d",&n,&m,&t);//输入数字 //printf("N:%d M:%d T:%d\n",n,m,t);for(i=0;i<n;i++) scanf("%d %d",&f[i].items.ratio,&f[i].items.power);for(j=0;j<m;j++,i++) {scanf("%d %d",&ra,&po);//在输入时就验证是加法还是减法if(t){//t=1是减法f[i].items.ratio=-ra;f[i].items.power=po; } else{//加法 f[i].items.ratio=ra;f[i].items.power=po;}}//进行排序for(i=0;i<m+n;i++){ for(j=0;j<m+n-i-1;j++){if(f[j].items.power>f[j+1].items.power){temp1=f[j].items.power;f[j].items.power=f[j+1].items.power;f[j+1].items.power=temp1;temp2=f[j].items.ratio;f[j].items.ratio=f[j+1].items.ratio;f[j+1].items.ratio=temp2;}}}//进行计算for(i=0;i<m+n;i++){if(f[i].items.power!=f[i+1].items.power){fooo[k].items.power=f[i].items.power;fooo[k].items.ratio=f[i].items.ratio;// printf("fooo%d:%d %d\n",k,fooo[k].items.ratio,fooo[k].items.power); k++;}if(f[i].items.power==f[i+1].items.power){f[i+1].items.ratio+=f[i].items.ratio;} } //打印多项式 for(i=0;fooo[i].items.ratio==0;i++);if(fooo[i].items.ratio!=0){//由于第一位不带加减号。count=0; if(fooo[i].items.ratio==1){if(fooo[i].items.power==0)printf("%d",fooo[0].items.ratio);else if(fooo[i].items.power==1) printf("x");else printf("x^%d",fooo[i].items.power);}else if(fooo[i].items.ratio==-1){if(fooo[i].items.power==0)printf("%d",fooo[i].items.ratio);else if(fooo[i].items.power==1) printf("-x");else printf("-x^%d",fooo[i].items.power);}else{if(fooo[i].items.power==0)printf("%d",fooo[i].items.ratio);else if(fooo[i].items.power==1) printf("%dx",fooo[i].items.ratio);else printf("%dx^%d",fooo[i].items.ratio,fooo[i].items.power);}}for(i++;i<k;i++){//对后面的数字进行加减 if(fooo[i].items.ratio>0){//如果系数是大于0的数字count=0; if(fooo[i].items.ratio==1){// 要特别注意1的情况if(fooo[i].items.power==0) printf("%d",fooo[i].items.ratio);else if(fooo[i].items.power==1) printf("+x");else printf("+x^%d",fooo[i].items.power);}else{if(fooo[i].items.power==0)printf("+%d",fooo[i].items.ratio);else if(fooo[i].items.power==1) printf("+%dx",fooo[i].items.ratio);else printf("+%dx^%d",fooo[i].items.ratio,fooo[i].items.power);}}else if(fooo[i].items.ratio==0){count=1;continue;}else{//如果本身是负数,既有符号,就不需要再加上,多余 count=0;if(fooo[i].items.ratio==-1){if(fooo[i].items.power==0)printf("%d",fooo[i].items.ratio);else if(fooo[i].items.power==1) printf("-x");else printf("-x^%d",fooo[i].items.power);}else{if(fooo[i].items.power==0)printf("%d",fooo[i].items.ratio);else if(fooo[i].items.power==1) printf("%dx",fooo[i].items.ratio);else printf("%dx^%d",fooo[i].items.ratio,fooo[i].items.power);} }}if(count)printf("0");return 0;
}
130行太多了太多了——
对于一个C的基础题,这就像你写1+1;
写过程用了nnnnnn个方程来解决一样。
哎呀,就是比喻不大确切。
不过,要是能够优化,请扣我!!!
乐意至极,谢谢。
这篇关于XDOJ-一元稀疏多项式计算器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!