问题 C: 数据结构作业01 -- 一元多项式的求积
时间限制: 1 Sec 内存限制: 128 MB提交: 1711 解决: 293
[提交][状态][讨论版]
题目描述
一个一元多项式可以看作由若干个一元单项式按降幂排列成的线性表。请编写程序对输入的两个一元多项式求积,并输出求积的结果。
输入
输入为两个一元多项式,每个一元多项式输入一行,按照降幂依次输入每个单项式的系数和指数,并以-1 -1作为结束。 系数和指数均为整数,指数不小于0。
输出
输出为求积结果多项式,按照降幂依次输出每个单项的系数和指数,每个数值后面用一个空格隔开,输出结果多项式后换行。 系数为0的单项式不得输出——除非结果多项式就是0,则直接输出0。
样例输入
2 5 1 0 -1 -1
5 4 3 0 -1 -1
样例输出
10 9 6 5 5 4 3 0
#include<stdio.h> #include<string.h> int a[100000],b[100000],c[100000]; int main(){ int i,j; int an,m,n; m=0; n=0; int max,maxa,maxb; max=0; maxa=0; maxb=0; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); while(~scanf("%d %d",&n,&m)){ if(m==-1&&n==-1) break; if(maxa<m) maxa=m; a[m]=n; } while(~scanf("%d%d",&n,&m)){ if(m==-1&&n==-1) break; if(maxb<m) maxb=m; b[m]=n; } max=maxa+maxb; for(i=0;i<=maxa;i++){ for(j=0;j<=maxb;j++){ n=a[i]*b[j]; if(n!=0){ m=i+j; c[m]+=n; } } } int flag=1; for(i=max;i>=0;i--){ if(c[i]!=0){ flag=0; printf("%d %d ",c[i],i); } } if(flag) printf("0"); printf(" "); return 0; }
第一:memset(a,1,size) 对数组地址 a 开始赋size 个1
第二: 当我们输入时,其实是输入的ASCALL码,范围为0~255 ,c中将EOF定义为-1,当 scanf()==EOF 就是输入错误了,而 ~ 是位运算,它是将数据在内存中的每一位(当然是二进制)取反。-1在内存中所有位全部为1,~(-1)=0,即对-1取非就是0。
第三:背包法思想,很有用,没事可以拿出来好好思考。