#include <stdio.h>
#include <math.h>
#include <assert.h>
typedef struct POLYM{ // 多项式数据结构
int n; // n-1 次多项式 a0+a1x+...+a[n-1]x^(n-1)
double*a; // 必须在运算之前初始化
}*LPPOLYM;
void showPolym(POLYM*pf){ if(!pf) return;
printf("%d\n",pf->n);
for(int i=0; i<pf->n; i++) printf("%.1f\t",pf->a[i]);
printf("\n");
}
POLYM* poly_add(POLYM*pout, POLYM*f,POLYM*g){ if(!pout ||!f || !g) return 0L;
int n=f->n; if(n<g->n) n=g->n; pout->n=n;
double*p=f->a, *q=g->a, *r=pout->a;
for(int i=0; i<n; i++, r++) { *r=0;
if(i<=f->n) *r+=*p++;
if(i<=g->n) *r+=*q++;
}
return pout;
}
POLYM* poly_subtract(POLYM*pout, POLYM*f,POLYM*g){ if(!pout ||!f || !g) return 0L;
int n=f->n; if(n<g->n) n=g->n; pout->n=n;
double*p=f->a, *q=g->a, *r=pout->a;
for(int i=0; i<n; i++, r++) { *r=0;
if(i<=f->n) *r-=*p++;
if(i<=g->n) *r-=*q++;
}
return pout;
}
POLYM* poly_x(POLYM*pout, POLYM*f,POLYM*g){ if(!pout ||!f || !g) return 0L;
int m=f->n, n=g->n; assert(m>=0 && n>=0);
pout->n= m+n-1;
double*p=f->a, *q=g->a, *r=pout->a;
double c;
for(int i=0; i<m+n; i++, r++) {
c=0;
for(int j=0; j<m; j++) if( (i-j>=0) && (i-j<n) ) c+=f->a[j]*g->a[i-j];
*r=c;
}
return pout;
}
int main(int argc, char *argv[]){
int m=2, n=3;
double fa[]={1,2,}, ga[]={4,5,6}; // 初始化 f, g
POLYM f={m, fa}, g={n, ga};
POLYM r; r.a=new double[m+n+1]; // 初始化 r
showPolym(&f);
showPolym(&g);
// POLYM*q=poly_add(&r,&f,&g); showPolym(q);
POLYM*q=poly_x(&r,&f,&g); showPolym(q);
return 0;
}
追问你好,请问源代码就这么多吗,这里包括print输出表达式吗?可以进行多项式的加减乘或除吗?帮我解答吧
追答可以进行多项式的加减乘 。
除法过于麻烦了。。
追问请问你这是用什么方法编写的?有用单链表写的吗,题目是多项式的运算,要求在屏幕上显示所输入的表达式?
追答不用链表:
showPolym(&f); // 显示多项式 f
showPolym(&g); // 显示多项式 g
// POLYM*q=poly_add(&r,&f,&g); showPolym(q); // 显示多项式 f +g
POLYM*q=poly_x(&r,&f,&g); showPolym(q); // 显示多项式 f *g
Win32 Console 工程直接编译执行就行了。。。