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个方程来解决一样。
哎呀,就是比喻不大确切。
不过,要是能够优化,请扣我!!!
乐意至极,谢谢。

  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值