设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0
。
输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
解题思路
关键是数据怎么存,怎么存储在计算机里面,使得我们可以方便的计算加法和乘法。我们可以用一个数组,用下标表示指数,用值存这个指数对应的系数,然后去算加法、乘法就会非常的方便。
参考代码 1(用数组实现)
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define maxn 100004
int a[maxn],b[maxn],ans[maxn];
int main()
{
int n,m,i,j,t,flag,coe,exp;
while( scanf("%d",&n)!=EOF){
memset(a,0,sizeof(a));/*先将数组a,b全部置为0*/
memset(b,0,sizeof(b));
for(i=0;i<n;i++){
scanf("%d%d",&coe,&exp);
a[exp]+=coe;/*下标做指数,值存系数*/
}
scanf("%d",&m);
for(j=0;j<m;j++){
scanf("%d%d",&coe,&exp);
b[exp]+=coe;
}
/*乘法*/
t=0;
memset(ans,0,sizeof(ans));
for(i=0;i<1004;i++){
if(a[i]!=0){
for(j=0;j<1004;j++){
if(b[j]!=0){
ans[i+j]+=a[i]*b[j];/*系数相乘,指数相加*/
if(ans[i+j]!=0){
t++;/*记录是否至少有一项*/
}
}
}
}
}
if(t==0){/*如果一项都没有,就是0 0*/
printf("0 0\n");
}
else{
flag=0;
for(i=2004;i>=0;i--){
if(ans[i]!=0){
if(flag==0){/*输出第一项(没有前置空格)*/
printf("%d %d",ans[i],i);
flag=1;
}
else{/*输出剩下的项*/
printf(" %d %d",ans[i],i);
}
}
}
printf("\n");
}
/*加法*/
t=0;
memset(ans,0,sizeof(ans));
for(i=0;i<1004;i++){
ans[i]=a[i]+b[i];/*指数不变,系数相加*/
if(ans[i]!=0){
t++;
}
}
if(t==0){
printf("0 0\n");
}else{
flag=0;
for(i=1004;i>=0;i--){
if(ans[i]!=0){
if(flag==0){
printf("%d %d",ans[i],i);
flag=1;
}
else{
printf(" %d %d",ans[i],i);
}
}
}
printf("\n");
}
}
return 0;
}
参考代码 2(用链表实现)
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
#define maxn 10000010
struct PolyNode{
int coe;//系数
int exp;//指数
struct PolyNode *Next;//指向下一个结点的指针
};
typedef struct PolyNode *Polynomial;
Polynomial P1,P2;
/** \brief 由c,e构造一个新结点接在Rear指向结点的后面
由于本函数需要修改当前结果表达式尾向指针的值
所以函数传递进来的是节点指针的地址 *pRear指向尾项
* \param
* \param
* \return
*/
void Attach(int c,int e,Polynomial *pRear){
Polynomial P;
P=(Polynomial)malloc(sizeof(struct PolyNode));
P->coe=c; P->exp=e;
P->Next=NULL;
(*pRear)->Next=P;
*pRear=P;
}
Polynomial ReadPoly(){
Polynomial P,Rear,t;
int c,e,N;
scanf("%d",&N);
P=(Polynomial)malloc(sizeof(struct PolyNode));/*链表头空结点*/
P->Next=NULL;
Rear=P;
for(int i=0; i<N; i++){
scanf("%d%d",&c,&e);
if(c!=0)
Attach(c,e,&Rear);/*将当前项插入多项式尾部*/
}
t=P; P=P->Next; free(t);/*删除临时生成的结点*/
return P;
}
Polynomial PolyAdd(Polynomial P1,Polynomial P2){
Polynomial t1,t2,Front,Rear,temp;
int sum;
t1=P1; t2=P2;
//为方便表头插入 先产生一个临时空结点 作为结果多项式链表头
Rear=(Polynomial)malloc(sizeof(struct PolyNode));
Front=Rear;//由Front记录结果多项式链表头结点
while(t1&&t2){
if(t1->exp > t2->exp){//P1中数据项指数较大
Attach(t1->coe,t1->exp,&Rear);
t1=t1->Next;
}
else if(t1->exp < t2->exp){
Attach(t2->coe,t2->exp,&Rear);
t2=t2->Next;
}
else{
sum=t1->coe+t2->coe;
if(sum){
Attach(sum,t1->exp,&Rear);
}
t1=t1->Next;
t2=t2->Next;
}
}
while(t1){
Attach(t1->coe,t1->exp,&Rear);
t1=t1->Next;
}
while(t2){
Attach(t2->coe,t2->exp,&Rear);
t2=t2->Next;
}
Rear->Next=NULL;
temp=Front;
Front=Front->Next;
free(temp);
return Front;
}
Polynomial Mult(Polynomial P1,Polynomial P2){
Polynomial P,Rear,t1,t2,t;
int c,e,sum;
if(!P1||!P2) return NULL;
t1=P1; t2=P2;
P=(Polynomial)malloc(sizeof(struct PolyNode));
P->Next=NULL;
Rear=P;
while(t2){/*先用P1的的第1项乘以P2,得到P*/
Attach(t1->coe*t2->coe,t1->exp+t2->exp,&Rear);
t2=t2->Next;
}
t1=t1->Next;
while(t1){
t2=P2; Rear=P;
while(t2){
c=t1->coe * t2->coe;
e=t1->exp + t2->exp;
while(Rear->Next&&Rear->Next->exp>e){
Rear=Rear->Next;
}
if(Rear->Next&&Rear->Next->exp==e){
sum=c + Rear->Next->coe;
if(sum){
Rear->Next->coe=sum;
}
else{//如果系数是0则删除这个结点
t=Rear->Next;
Rear->Next=t->Next;
free(t);
}
}
else{
t=(Polynomial)malloc(sizeof(struct PolyNode));
t->coe=c; t->exp=e;
t->Next=Rear->Next;
Rear->Next=t; Rear=Rear->Next;
}
t2=t2->Next;
}
t1=t1->Next;
}
t2=P; P=P->Next; free(t2);
return P;
}
void PrintPoly(Polynomial P){/*输出多项式*/
int flag=0;
if(!P){
printf("0 0\n"); return ;
}
while(P){
if(!flag){
flag=1;
}
else{
printf(" ");
}
printf("%d %d",P->coe,P->exp);
P=P->Next;
}
printf("\n");
}
int main(){
//freopen("in.txt", "r", stdin);
Polynomial P1,P2,PP,PS;
P1=ReadPoly();
P2=ReadPoly();
PP=Mult(P1,P2);
PrintPoly(PP);
PS=PolyAdd(P1,P2);
PrintPoly(PS);
return 0;
}