一元稀疏多项式计算器
要变得更强。
————更新————
下面同学说的问题我改正啦。
没改之前:
可以看到多了个负号,是因为在这个结构体里面,第一项就是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个方程来解决一样。
哎呀,就是比喻不大确切。
不过,要是能够优化,请扣我!!!
乐意至极,谢谢。