📄 sjh一元多项式--完全.cpp
字号:
//一元多项式符号计算-含因式分解版
//不仅包含+,-,*,/,多项式求值,数值积微分,(内含多项式求根子程序),定与不定积分,还有因式分解(求根法).
//用单链表.输入格式按提示.
//作者:施钧辉 sjh123@mail.ustc.edu.cn
/*polynomial.c*/
#define NULL 0
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define MAXREPT 1000
#define epsilo 0.00001
#define bottom_top 1004.19
typedef struct LNode{
float coef;
int expn;
struct LNode *next;
}LNode,*polyn;
void sort(polyn p){
polyn q;int b;float a;int i,j;
if(p->expn==1) return;
for(i=p->expn;i>1;i--){
q=p->next;
for(j=1;j<i;j++){
if(q->expn>q->next->expn){
q=q->next;
}
else if(q->expn<q->next->expn){
a=q->coef;b=q->expn;
q->coef=q->next->coef;q->expn=q->next->expn;
q->next->coef=a;q->next->expn=b;
q=q->next;
}
else {
q->coef+=q->next->coef;
q->next=q->next->next;
p->expn--;if(p->expn==1) return;
}
}
}
}
void input_p(polyn p){/*输入并生成一元多项式*/
int i;
float f;
polyn q,l;
/*生成头结点*/
if (!p) exit(-2);
p->coef=0;
printf("请输入项数:");
scanf("%d",&(p->expn)); /*利用头结点的指数域保存项数*/
p->next=NULL;
for(i=1;i<=p->expn;i++){
q=(polyn)malloc(sizeof(LNode));
printf("第%d项系数:",i);
scanf("%f",&f);
q->coef=f;
printf("第%d项指数:",i);
scanf("%d",&(q->expn));
q->next=p->next;
p->next=q;
}/*for*/
sort(p);
}/*input_p*/
void output_p(polyn p){
polyn q,l;
q=p->next;l=p;
while(q&&l){
if(q->coef==0){
q=q->next;l->next=q;
p->expn--;
}
else {q=q->next;l=l->next;}
}
printf("\n共%d项: ",p->expn);
q=p->next;
while(q&&(q->expn>=0)){
if(q->coef!=1&&q->coef!=-1) printf("%g",q->coef);
else if(q->coef==-1&&q->expn!=0) printf("-");
else if(q->coef==-1&&q->expn==0) printf("-1");
else if(q->coef==1&&q->expn==0) printf("%g",q->coef);
if(q->expn!=0&&q->expn!=1){
printf("x^");
printf("%d",q->expn);
}
else if(q->expn!=0){
printf("x");
}
if((q->expn>0&&(q->next&&q->next->coef>0)))printf("+");
q=q->next;
}
printf("\n");
}/*output_p*/
float value_p(polyn pa,float x){
float a=0,b=1;int i; polyn q;
q=pa->next;
while(q){
i=q->expn;
while(i){
b=b*x;
i--;
}
a=a+(q->coef)*b;b=1;
q=q->next;
}
return a;
}
void add_p(polyn pa,polyn pb){
/*pa=pa+pb*/
polyn ha,hb,hc,p;
ha=pa->next;
hb=pb->next;
hc=pa;
hc->next=NULL;
pa->expn=0;
while (ha&&hb){
if (ha->expn>hb->expn){
hc->next=ha;
hc=ha;
ha=ha->next;
hc->next=NULL;
pa->expn++;
}/*if ha->expn>hb->expn */
else
if (ha->expn<hb->expn){
hc->next=hb;
hc=hb;
hb=hb->next;
hc->next=NULL;
pa->expn++;
}/*if ha->expn<hb->expn*/
else{/*ha->expn=hb->expn*/
ha->coef+=hb->coef;
if (ha->coef){
hc->next=ha;
hc=ha;
ha=ha->next;
hc->next=NULL;
pa->expn++;
p=hb;
hb=hb->next;
free(p);
}/*if ha->coef!=0*/
else{/*ha->coef=0*/
p=ha;
ha=ha->next;
free(p);
p=hb;
hb=hb->next;
free(p);
}/*else*/
}/*else*/
}/*while*/
if (ha){
hc->next=ha;
while(ha){
pa->expn++;
ha=ha->next;
}/*while*/
}/*if*/
if (hb) {
hc->next=hb;
while (hb){
pa->expn++;
hb=hb->next;
}/*while*/
}/*if*/
free(pb);
}/*add_p*/
void minus_p(polyn pa,polyn pb){
/*pa=pa-pb*/
polyn ha,hb,hc,p;
ha=pa->next;
hb=pb->next;
hc=pa;
hc->next=NULL;
pa->expn=0;
while (ha&&hb){
if (ha->expn>hb->expn){
hc->next=ha;
hc=ha;
ha=ha->next;
hc->next=NULL;
pa->expn++;
}/*if ha->expn>hb->expn*/
else if (ha->expn<hb->expn){
hb->coef*=-1;
hc->next=hb;
hc=hb;
hb=hb->next;
hc->next=NULL;
pa->expn++;
}/*if ha->expn<hb->expn*/
else{/*ha->expn=hb->expn*/
ha->coef-=hb->coef;
if (ha->coef){
hc->next=ha;
hc=ha;
ha=ha->next;
hc->next=NULL;
pa->expn++;
p=hb;
hb=hb->next;
free(p);
}/*if*/
else{
p=ha;
ha=ha->next;
free(p);
p=hb;
hb=hb->next;
free(p);
}/*else*/
}/*else*/
}/*while*/
if (ha) {
hc->next=ha;
while(ha){
pa->expn++;
ha=ha->next;
}/*while*/
}/*if*/
if (hb) {
hc->next=hb;
while (hb){
hb->coef*=-1;
pa->expn++;
hb=hb->next;
}/*while*/
}/*if*/
free(pb);
}/*minus_p*/
void multiply_p(polyn pa,polyn pb){
int i; polyn ha,hb,p,l,pc,pd;
pd=(polyn)malloc(sizeof(LNode));
pd->next=NULL;
if(!pd)exit(-2);
hb=pb->next;
for(i=0;i<(pb->expn);i++){
ha=pa->next;
p=(polyn)malloc(sizeof(LNode));p->next=NULL;
while(ha){
l=(polyn)malloc(sizeof(LNode));
l->coef=ha->coef;
l->expn=ha->expn;
l->next=p->next;
p->next=l;
ha=ha->next;
}
l=(polyn)malloc(sizeof(LNode));
l=p->next;
while(l){
(l->coef)*=hb->coef;
(l->expn)+=hb->expn;
l=l->next;
}free(l);
pc=(polyn)malloc(sizeof(LNode));pc->next=NULL;
if(!pc)exit(-2);
p=p->next;
while(p){
l=(polyn)malloc(sizeof(LNode));
l->coef=p->coef;
l->expn=p->expn;
l->next=pc->next;
pc->next=l;
p=p->next;
}
add_p(pd,pc);
hb=hb->next;
}/*for*/
printf("两个多项式之积为:");
output_p(pd);
}/*multiply_p*/
void inverse(polyn pb1){
polyn l,p,pb2;
pb2=(polyn)malloc(sizeof(LNode));
pb2->next=NULL;
p=pb1->next;
while(p){
l=(polyn)malloc(sizeof(LNode));
l->coef=p->coef;
l->expn=p->expn;
l->next=pb2->next;
pb2->next=l;
p=p->next;
}
pb1=pb2;
}
void copy(polyn pb1,polyn pb){
polyn l,p;
p=pb->next;
while(p){
l=(polyn)malloc(sizeof(LNode));
l->coef=p->coef;
l->expn=p->expn;
l->next=pb1->next;
pb1->next=l;
p=p->next;
}
}
polyn divide_p(polyn pa,polyn pb){
polyn ha,hb,pb1,pc,l,pb2,q;
pc=(polyn)malloc(sizeof(LNode)); pc->next=NULL; pc->expn=0;
l=(polyn)malloc(sizeof(LNode));
q=(polyn)malloc(sizeof(LNode));
pb1=(polyn)malloc(sizeof(LNode)); pb1->next=NULL;
pb2=(polyn)malloc(sizeof(LNode)); pb2->next=NULL;
copy(pb2,pb);
copy(pb1,pb2);
ha=pa->next;
hb=pb1->next;
while(ha&&ha->expn>=hb->expn){
l=(polyn)malloc(sizeof(LNode));
l->coef=(pa->next->coef/pb1->next->coef);
l->expn=(pa->next->expn-pb1->next->expn);
while(hb){
hb->coef*=l->coef;
hb->expn+=l->expn;
hb=hb->next;
}
l->next=pc->next;
pc->next=l;
pc->expn++;
minus_p(pa,pb1);
pb1=(polyn)malloc(sizeof(LNode));
pb1->next=NULL;
pb2=(polyn)malloc(sizeof(LNode));
pb2->next=NULL;
copy(pb2,pb);
copy(pb1,pb2);
ha=pa->next;
hb=pb1->next;
}
printf("\n");
sort(pc);
return pc;
}
void deriviate_p(polyn pa){
polyn p;
p=pa->next;
while(p){
p->coef*=p->expn;
p->expn-=1;
p=p->next;
}
}
void integrate_p(polyn pa){
polyn p;
p=pa->next;
while(p){
p->coef/=(p->expn+1);
p->expn+=1;
p=p->next;
}
}
float root_p(polyn pa,float a1,float a2){
int i;
float x=a1,x1=a2,x2=a2;
for(i=0;i<MAXREPT;i++){
x2=x1-value_p(pa,x1)*(x-x1)/(value_p(pa,x)-value_p(pa,x1));
if (fabs(x2-x1)<epsilo||fabs(value_p(pa,x2))<0.0001){
return (x2);
}
if(value_p(pa,x2)*value_p(pa,x)<0){
x1=x2;
}
else if(value_p(pa,x2)*value_p(pa,x1)<0)
{x=x2;
}
}
}
void fenjie_p(polyn pa){
polyn pb,l,pc,q;pb=(polyn)malloc(sizeof(LNode));pb->next=NULL;pc=(polyn)malloc(sizeof(LNode));
float a1,a2;float m;int a=-1000;pc=pa;int i=pa->next->expn;
while(a<1000&&pc->next->expn>1){
if(value_p(pa,a)==0){
m=a;
{if(m<0){
printf("(x+");
printf("%g",fabs(m));
printf(")");
}
else if(m==0){
printf("x");
}
else {
printf("(x-");
printf("%g",m);
printf(")");
}
}
l=(polyn)malloc(sizeof(LNode));
l->coef=-m;
l->expn=0;
l->next=pb->next;
pb->next=l;
l=(polyn)malloc(sizeof(LNode));
l->coef=1;
l->expn=1;
l->next=pb->next;
pb->next=l;
pb->expn=2;
pc=divide_p(pa,pb);
pa=pc;
pb->next=NULL;
a-=1;
}
a+=1;
}
a1=-bottom_top,a2=-bottom_top+1;
while(a1<bottom_top&&pc->next->expn>1){
if(value_p(pa,a1)*value_p(pa,a2)<0){
m=root_p(pa,a1,a2);
if(fabs(m-floor(m+1))<0.0001){
m=floor(m+1);
}
if(fabs(m-floor(m))<0.0001){
m=floor(m);
}
{if(m<0){
printf("(x+");
printf("%g",fabs(m));
printf(")");
}
else if(m==0){
printf("x");
}
else {
printf("(x-");
printf("%g",m);
printf(")");
}
}
l=(polyn)malloc(sizeof(LNode));
l->coef=-m;
l->expn=0;
l->next=pb->next;
pb->next=l;
l=(polyn)malloc(sizeof(LNode));
l->coef=1;
l->expn=1;
l->next=pb->next;
pb->next=l;
pb->expn=1;
pc=divide_p(pa,pb);
pa=pc;
a1-=0.33;a2-=0.33;
}
a1+=0.33;a2+=0.33;
}
//以下为输出
q=pc->next;l=pc;
while(q&&l){
if(q->coef==0){
q=q->next;l->next=q;
pc->expn--;
}
else {q=q->next;l=l->next;}
}
if(i==pa->next->expn) printf("(实数范围内不可分解)\n");
if(pa->expn==1&&(pa->next->expn==0&&pa->next->coef!=1))printf("%g",pa->next->coef);
else if(pa->expn==1&&(pa->next->expn==1&&pa->next->coef!=1)){printf("%g",pa->next->coef);printf("x");}
if(pa->expn!=1&&i!=pa->next->expn) printf("(");
q=pc->next;
while(pa->expn!=1&&(q&&(q->expn>=0))){
if(q->coef!=1&&q->coef!=-1) printf("%g",q->coef);
else if(q->coef==-1&&q->expn!=0) printf("-");
else if(q->coef==-1&&q->expn==0) printf("-1");
else if(q->coef==1&&q->expn==0) printf("%g",q->coef);
if(q->expn!=0&&q->expn!=1){
printf("x^");
printf("%d",q->expn);
}
else if(q->expn!=0){
printf("x");
}
if((q->expn>0&&(q->next&&q->next->coef>0)))printf("+");
q=q->next;
}
if(pa->expn!=1&&i!=pa->next->expn) printf(")");
printf("\n");
}
main(){
char c=' ',ch=' '; float x,y;
printf(" ****一元多项式运算器****\n **** 作者: 施钧辉 ****\n 本程序可进行加,减,乘,除,数值,因式分解,求导,微分运算。");
start: polyn pa,pb;pa=(polyn)malloc(sizeof(LNode));pb=(polyn)malloc(sizeof(LNode));
printf("\n*多项式运算选1\n*做数值运算选2\n*因式分解请选3\n*求导函数请选4\n*求不定积分选5\n--选择:_");
while(c!='1'&&(c!='2'&&(c!='3'&&(c!='4'&&c!='5'))))
scanf("%c",&c);
switch(c){
case('1'): {
printf("请输入第一个多项式\n");
input_p(pa);
output_p(pa);
printf("请输入运算符(+或-或*或/):");
while(c!='+'&&(c!='-'&&(c!='*'&&c!='/')))
scanf("%c",&c);
printf("请输入第二个多项式\n");
input_p(pb);
output_p(pb);
switch(c){
case('+'): add_p(pa,pb); printf("两个多项式之和为:");output_p(pa); break;
case('-'): minus_p(pa,pb); printf("两个多项式之差为:");output_p(pa); break;
case('*'): multiply_p(pa,pb); break;
case('/'): printf("商多项式为:"); output_p(divide_p(pa,pb));
if(pa->next!=0){
printf("余项为:");
output_p(pa);
}
else printf("正好整除\n");
break;
}
} ; break;
case('2'):{
printf("\n多项式求值请选1,求数值微分请选2,求定积分请选3:");
while(ch!='1'&&(ch!='2'&&ch!='3'))
scanf("%c",&ch);
printf("\n");
if(ch=='1'){printf("多项式求值:\n");
input_p(pa);output_p(pa);
printf("\n请输入数值: ");
scanf("%f",&x);
y=value_p(pa,x);
printf("多项式求值结果为:");
printf("%g\n",y);
}
else if(ch=='2'){printf("求数值微分:\n");
input_p(pa);output_p(pa);
printf("\n请输入数值: ");
scanf("%f",&x);
deriviate_p(pa);
y=value_p(pa,x);
printf("数值微分结果为: ");
printf("%g\n",y);
}
else { printf("求数值积分:\n");
input_p(pa);output_p(pa);
printf("\n请输入数值区间: ");
scanf("%f,%f",&x,&y);
integrate_p(pa);
printf("数值积分结果为:");
printf("%g",value_p(pa,y)-value_p(pa,x));
}
}
; break;
case('3'): printf("请输入多项式\n");
input_p(pa);
output_p(pa);
printf("因式分解结果为:\n");
fenjie_p(pa);
break;
case('4'): printf("请输入多项式\n");
input_p(pa);
output_p(pa);
deriviate_p(pa);
printf("导函数为: ");
output_p(pa);
break;
case('5'): printf("请输入多项式\n");
input_p(pa);
output_p(pa);
integrate_p(pa);
printf("不定积分为: ");
output_p(pa);
printf("+");
printf("const\n");
break;
}
printf("继续运算请选c,退出请选e: ");
while(c!='c'&&c!='e')
scanf("%c",&c);
while(c=='c') goto start;
}/*main*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -