当前位置: 代码迷 >> 综合 >> 一元稀疏多项式-xdoj
  详细解决方案

一元稀疏多项式-xdoj

热度:90   发布时间:2023-12-06 09:19:09.0

标题: 一元稀疏多项式计算器 

类别: 综合

时间限制 2S

内存限制 1000Kb

问题描述 一元 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


程序整体分为两部分:1 把两个多项式相加并排序;2 输出结果(操蛋部分)

只有不是第一项并且系数大于零时才输出+

输出中先按系数=1、-1、其他分出第一层选择结构,再按指数=1、0、其他分第二层

以上规律可以自己在纸上理一遍,下面是我的草稿


#include<stdio.h>
struct term//用结构体存储每一组系数+指数
{int coe;//coefficientint ind;//index
}a[1000],b[1000],temp;
int main()
{int n,m,t,i,j,k=1;scanf("%d%d%d",&n,&m,&t);if(t!=0)k=-1;for(i=0;i<n;i++)scanf("%d%d",&a[i].coe,&a[i].ind);for(i=0;i<m;i++)scanf("%d%d",&b[i].coe,&b[i].ind);for(i=0;i<n;i++)//b[]中指数与a[]相等项的系数加到a[]的对应项上,然后该项b[]系数归零{for(j=0;j<m;j++){if(a[i].ind==b[j].ind){a[i].coe+=k*b[j].coe;b[j].coe=0;}}}j=0;for(i=0;i<m;i++)//把b[]中系数非零项拼到a[]的后面{if(b[i].coe!=0){a[n+j].coe=k*b[i].coe;a[n+j].ind=b[i].ind;j++;}}n=n+j;//记得更改n的大小for(i=0;i<n-1;i++)//排序{for(j=0;j<n-1-i;j++){if(a[j].ind>a[j+1].ind){temp=a[j];a[j]=a[j+1];a[j+1]=temp; }}}//系数为 0 时不输出该项,指数为 1 时不输出指数int all=0;//判断是否所有项均为零int first=0;//判断a[]是否是第一个输出for(i=0;i<n;i++){if(a[i].coe!=0)//首先看系数,不为零才输出、才配当第一项 {all=1;if(first==1&&a[i].coe>0)printf("+");first=1;if(a[i].coe==1){if(a[i].ind==1)printf("x");else if(a[i].ind==0)printf("%d",a[i].coe);elseprintf("x^%d",a[i].ind);}else if(a[i].coe==-1){if(a[i].ind==1)printf("-x");else if(a[i].ind==0)printf("%d",a[i].coe);elseprintf("-x^%d",a[i].ind);}else{if(a[i].ind==1)printf("%dx",a[i].coe);else if(a[i].ind==0)printf("%d",a[i].coe);elseprintf("%dx^%d",a[i].coe,a[i].ind);}}}if(all==0)printf("0");return 0;
}