一元稀疏多项式加法运算
2014-10-14 16:45
183 查看
描述:
设计一个一元稀疏多项式加法运算器,完成多项式a和b相加,建立多项式a+b。
输入说明:
一组输入数据,所有数据均为整数。第1行为2个正整数n,m,其中 n表示第一个多项式的项数,m表示第二个多项式的项数;第2行包含2n个整数,每两个整数分别表示第一个多项式每一项的系数和指数;第3行包含2m个整数,每两个整数分别表示第二个多项式每一项的系数和指数。(注:序列按指数升序排列)
输出说明:
在一行以类多项式形式输出结果,指数按从低到高的顺序。注意,系数值为1的非零次项的输出形式中略去系数1,如1x^2的输出形式为x^2,-1 x^2的输出形式为-x^2。
输入样例:
6 2
1 0 1 1 1 2 1 3 1 4 2 5
-1 3 -2 4
输出样例:
1+x+x^2-x^4+2x^5
下面贴上我写的代码:
******
解题报告:
这道题目在算法上没有困难,只是在数据结构和输出这两个方面需要一定技巧。
首先是数据结构的设计,即如何把题目所给的两个多项式存储起来?上面代码使用两个数组a1和a2来分别保存两个多项式,当然也可以有其他方法。首先,用memset函数将a1和a2两个数组所有元素初始化为0,然后依次读入多项式的各个项,数组的下标表示多项式中项的指数,数组中下标所对应的值表示此项的系数。例如:如果a1[3]的值为-2,就表示第一个多项式中包括“-2X3”这一项,又如果a1[2]的值为0,那么说明第一个多项式中没有指数为2的项。
输出方面一定要细心,仔细读题目的输出说明就会发现,当项的系数为0、-1、1这三个值时,输出格式和其它情况不同,而且某个项作为“和式”的首项和作为其他项,输出的格式是有差别的,差别在于首项前面是没有符号的,而其它想都需要在前面加上符号。
第35行代码(此时项的系数为1),flag为真时表示此项为“和式”的首项,用语句printf("X")打印输出,flag为假时表示此项不是“和式”的首项,用语句printf("+X")打印输出;第44行代码与此类似。
第37行代码(此时项的系数为1),只有flag为假并且项的系数是正数时,才会用printf("+%dX")打印输出,flag为真或项的系数为负数时用printf("%dX")打印输出;第46行代码与此类似。
设计一个一元稀疏多项式加法运算器,完成多项式a和b相加,建立多项式a+b。
输入说明:
一组输入数据,所有数据均为整数。第1行为2个正整数n,m,其中 n表示第一个多项式的项数,m表示第二个多项式的项数;第2行包含2n个整数,每两个整数分别表示第一个多项式每一项的系数和指数;第3行包含2m个整数,每两个整数分别表示第二个多项式每一项的系数和指数。(注:序列按指数升序排列)
输出说明:
在一行以类多项式形式输出结果,指数按从低到高的顺序。注意,系数值为1的非零次项的输出形式中略去系数1,如1x^2的输出形式为x^2,-1 x^2的输出形式为-x^2。
输入样例:
6 2
1 0 1 1 1 2 1 3 1 4 2 5
-1 3 -2 4
输出样例:
1+x+x^2-x^4+2x^5
下面贴上我写的代码:
#include<stdio.h> #include<string.h> int main() { int a1[1000]; int a2[1000]; memset(a1,0,sizeof(a1)); //将a1数组所有元素初始化为0 memset(a2,0,sizeof(a2)); //将a2数组所有元素初始化为0 int n,m; int t1,t2; //每次取两个数,t1为系数,t2为相应的指数 scanf("%d %d",&n,&m); for(int i=0;i<n;i++) //将第一个式子保存在a1中,a1的每个元素表示式子的一个项, { //元素的值为项的系数,元素下标为项的指数 scanf("%d %d",&t1,&t2); a1[t2]=t1; } for (int i=0;i<m;i++) //将第二个式子保存在a2中 { scanf("%d %d",&t1,&t2); a2[t2]=t1; } bool flag=true; //flag标记当前项否是“和式”的第一项,flag为true时表示当前项是“和式”的第一项 for(int i=0;i<1000;i++) //i表示项的指数,从0开始扫描 { int k=a1[i]+a2[i]; //k为两个式子中指数为i的项的系数的和 if(k!=0) //“和式”中有指数为i的项 { if(i==0) //如果此项的指数为0 printf("%d",k); else if(i==1) //如果此项的指数是1 { if(k==-1) //如果此项的指数是1,且系数是-1 printf("-X"); else if(k==1) //如果此项的指数是1,且系数是1 flag ? printf("X") : printf("+X"); else //如果此项的指数是1,系数不是-1或1 !flag&&k>0 ? printf("+%dX",k) : printf("%dX",k); } else //如果此项的指数大于1 { if(k==-1) //如果此项的指数大于1,且系数是-1 printf("-X^%d",i); else if(k==1) //如果此项的指数大于1,且系数是1 flag ? printf("X^%d",i) : printf("+X^%d",i); else //如果此项的指数大于1,且系数不是-1或1 !flag&&k>0 ? printf("+%dX^%d",k,i) : printf("%dX^%d",k,i); } flag=false; } } printf("\n"); return 0; }
******
解题报告:
这道题目在算法上没有困难,只是在数据结构和输出这两个方面需要一定技巧。
首先是数据结构的设计,即如何把题目所给的两个多项式存储起来?上面代码使用两个数组a1和a2来分别保存两个多项式,当然也可以有其他方法。首先,用memset函数将a1和a2两个数组所有元素初始化为0,然后依次读入多项式的各个项,数组的下标表示多项式中项的指数,数组中下标所对应的值表示此项的系数。例如:如果a1[3]的值为-2,就表示第一个多项式中包括“-2X3”这一项,又如果a1[2]的值为0,那么说明第一个多项式中没有指数为2的项。
输出方面一定要细心,仔细读题目的输出说明就会发现,当项的系数为0、-1、1这三个值时,输出格式和其它情况不同,而且某个项作为“和式”的首项和作为其他项,输出的格式是有差别的,差别在于首项前面是没有符号的,而其它想都需要在前面加上符号。
第35行代码(此时项的系数为1),flag为真时表示此项为“和式”的首项,用语句printf("X")打印输出,flag为假时表示此项不是“和式”的首项,用语句printf("+X")打印输出;第44行代码与此类似。
第37行代码(此时项的系数为1),只有flag为假并且项的系数是正数时,才会用printf("+%dX")打印输出,flag为真或项的系数为负数时用printf("%dX")打印输出;第46行代码与此类似。
相关文章推荐
- 实习一 线性表及其应用 (题目:一元稀疏多项式的加法运算 )
- 一元多项式的加法与乘法运算
- 5-1 一元多项式的乘法与加法运算 (20分)
- [PTA] 线性结构2 一元多项式的乘法与加法运算(20 分)
- 一元多项式的乘法与加法运算 (模拟)
- 02-线性结构2 一元多项式的乘法与加法运算 (20分)
- 【数据结构_链表_List_1040】一元多项式加法运算的实现
- 02-线性结构2 一元多项式的乘法与加法运算 (20分)
- 一元多项式的乘法与加法运算
- 02-线性结构2 一元多项式的乘法与加法运算(20 分)
- 5-2 一元多项式的乘法与加法运算 (20分)
- 3-04. 一元多项式的乘法与加法运算(20)
- PTA 7-1 一元多项式的乘法与加法运算
- 一元多项式的乘法与加法运算 【STL-map哈希-map反向迭代器遍历 + 零多项式】
- 一元多项式的乘法与加法运算(20 分)
- 线性结构2 一元多项式的乘法与加法运算
- 02-线性结构2 一元多项式的乘法与加法运算
- [PAT] 02-线性结构2 一元多项式的乘法与加法运算
- 02-线性结构2 一元多项式的乘法与加法运算 (20分)
- 02-线性结构2 一元多项式的乘法与加法运算