广西建设厅网站行业网杭州百度人工优化
《编程思维与实践》1037.一元多项式乘法
题目
思路
比较容易想到将步骤分为三步:
1.读取多项式每项的系数(coefficient)和对应的指数(dim);
2.进行多项式乘法;
3.输出进行多项式乘法后的非零项系数.
其中多项式乘法可以通过循环来处理,输出可以用if来判断系数是否为0,需要考虑的是如何读取多项式:
ax^y(a≠±1) , ±x^y , ax(a≠±1) , ±x 和 c(常数项) 为每项可能出现的所有情况.
一般情况只需要利用atoi存取系数,如果存完系数后读取的第一个字符不是x,
那表示读取的是常数项,否则直接跳过x,接着再存指数,最后利用指数为数组下标存系数.
注意的点:
1.对于 a=±1 和 有无 ‘^’ 的情况,用atoi时需要小心.
2.输出的时候指数应该从大到小(逆序).
3.多项式乘法后指数会变大,存结果时数组应该开大一些.
代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define N 100 //指数小于50void readpoly(char* s,int* coef) //polynomial 多项式
{while(*s!='\0'){char temp1[N]; char temp2[N];int i=0;int j=0;while(*s!='\0'&&(isdigit(*s)||*s=='+'||*s=='-')) //注意s别越界(条件写前面) {temp1[i++]=*s;s++;}if(i==0||(i==1&&!isdigit(temp1[0]))) //a=±1的情形{temp1[i++]='1';}temp1[i]='\0';if(*s!='x') //是常数项 (0次方){coef[0]=atoi(temp1); }else //非常数项{s++; //跳过xif(*s=='^') //判断是不是有'^'{s++;while(isdigit(*s)){temp2[j++]=*s;s++;}temp2[j]='\0';coef[atoi(temp2)]=atoi(temp1);}else{coef[1]=atoi(temp1);}}}
}void multiply(int* coef1,int* coef2,int* result)
{for(int i=0;i<N/2;i++){for(int j=0;j<N/2;j++){result[i+j]+=coef1[i]*coef2[j];}}
}void output(int *result)
{ for(int i=N-1;i>=0;i--) //逆向 {if(result[i]!=0){printf("%d ",result[i]);}}printf("\n");
} int main()
{char s[101]; //长度不超过100while(scanf("%s",s)!=EOF){int coef[2][N/2]; //coefficient 系数 memset(coef,0,sizeof(coef));readpoly(s,coef[0]);scanf("%s",s);readpoly(s,coef[1]); int result[N]={0};multiply(coef[0],coef[1],result);output(result); }return 0;
}