前言
让汗水成为铠甲,把困顿化为良机。
题干
问题描述
一元 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
解析
重要因素
- qsort 结构体排序
- 只需两数组,b --> a(储存运算结果)
- 用系数 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博客