⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sjh一元多项式--完全.cpp

📁 一元多项式符号计算-含因式分解版 不仅包含+,-,*,/,多项式求值,数值积微分,(内含多项式求根子程序),定与不定积分,还有因式分解(求根法). 用单链表.输入格式按提示.
💻 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 + -