XDOJ 一元稀疏多项式计算器 C

前言

让汗水成为铠甲,把困顿化为良机。


题干

问题描述

一元 n 次多项式p0 x^0+···+pi x^i···+pn x^n项数较少时成为一元稀疏多项式, 例如:3 + 6 x^3 − 2 x^8 + 12 x^20是一个一元稀疏多项式。设计一个一元稀疏多项式计算器程 序完成两个一元稀疏多项式的加减法,输出结果多项式的各项系数和指数。 输入说明 输入数据第 1 行为 3 个正整数 n,m,t。其中 n 表示第一个多项式的项数,m 表示第二个 多项式的项数,t 表示运算类型,0 为加法,1 为减法。数据的第 2 行包含 2n 个整数,每两 个整数分别表示第一个多项式每一项的系数和指数;第 3 行包含 2m 个整数,每两个整数分 别表示第二个多项式每一项的系数和指数。两个多项式的每项是按照指数递增的形式给出的, 例如对于多项式3 + 6 x^3 − 2 x^8 + 12 x^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


解析

重要因素

  1. qsort 结构体排序
  2. 只需两数组,b --> a(储存运算结果)
  3. 用系数 tt = 1 or -1 合并加减法

输出的核心逻辑(分类讨论)


解答

#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a, const void *b);
struct DATA{
	int coe;
	int exp;
};
int main(){
	int n,m,t,i,j,k=0;
	scanf("%d %d %d",&n,&m,&t);
	struct DATA a[n+m],b[m];
	for(i=0;i<n;i++){
		scanf("%d%d",&a[i].coe,&a[i].exp);
	}
	for(i=0;i<m;i++){
		scanf("%d%d",&b[i].coe,&b[i].exp);
	}
//	for(int i=0;i<n;i++){		// check input
//		printf("%d%d",a[i].coe,a[i].exp);
//	}
//	for(int i=0;i<m;i++){
//		printf("%d%d",b[i].coe,b[i].exp);
//	}
	int tt=1;
	if(t) tt=-1;		// achieve "+" and "-"
	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
			if(b[j].exp==a[i].exp){
				a[i].coe+=tt*b[j].coe;
				b[j].coe=0;
			} 
		}
	}
	for(i=0;i<m;i++){
		if(b[i].coe!=0){
			a[n+i].exp=b[i].exp;
			a[n+i].coe=tt*b[i].coe;
		}
		else{					// just for intializing other empty arrays
			a[n+i].exp=0;
			a[n+i].coe=0;
			k++;
		}
	}
	qsort(a,m+n,sizeof(a[0]),cmp);
//	for(i=0;i<m+n;i++){			// check qsort
//		printf("%d%d ",a[i].coe,a[i].exp);
//	}
	int f1=1,f2=0;			// f1: all the coefficients are "0", f2: the first one 
	for(i=0;i<m+n;i++){
		if(a[i].coe){
			if(f2 && a[i].coe>0) printf("+");
			f1=0;f2=1;	   // f1: all the coefficients are not "0", f2: not the first one
			if(a[i].coe==1){
                if(a[i].exp==1){
                    printf("x");
                }
                else if(a[i].exp==0){
                    printf("%d",a[i].coe);
                }
                else{
                    printf("x^%d",a[i].exp);
                }
            }
            else if(a[i].coe==-1){
                if(a[i].exp==1){
                    printf("-x");
                }
                else if(a[i].exp==0){
                    printf("%d",a[i].coe);
                }
                else{
                    printf("-x^%d",a[i].exp);
                }
            }
            else{
                if(a[i].exp==1){
                    printf("%dx",a[i].coe);
                }
                else if(a[i].exp==0){
                    printf("%d",a[i].coe);
                }
                else{
                    printf("%dx^%d",a[i].coe,a[i].exp);
                }
            }
		}	
	}
	if(f1){
		printf("0");
	}
	return 0;
}
int cmp(const void *a, const void *b){
	int s=-1;
	struct DATA *c=(struct DATA*)a;
	struct DATA *d=(struct DATA*)b;
	if((*c).exp>(*d).exp) s=1;
	return s;
}

拓展

本蒟蒻参考了前辈的代码,感谢:

 XDOJ.T133_一元稀疏多项式计算器_既然来了,请让我无耻地求一波赞QAQ-CSDN博客

qsort 结构体排序(该博文为转载)

 qsort结构体排序 (初学者必知)_yisandezhuiqiu的博客-CSDN博客_qsort结构体排序

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值