一元多项式运算器

  • 一.问题描述:设计一个一元多项式P=p0+p1x+p2x*2......+pnx*n的合适的数据结构,并支持两个多项式的下列运算:1.建立;2.输出;3.相加;4.相减;5.相乘;6.求导。
  • 二.数据结构:
  • typedef struct node
  • {
  •        float xishu;
  • int zhishu;
    struct node *next;
    }Lnode;
  • 三.方案设计:
  • 1.建立多项式:通过键盘输入多项式的系数和指数,用尾插法建立一元多项式的链表。本程序的指数必须由小到大输入,想要结束,系数输零即可。
  • 2.输出多项式:从单链表的第一个元素开始,逐项读出系数和指数,按多项式的形式输出即可。
  • 3.两个多项式相加:以单链表pa,pb分别表示两个单链表A,B,A+B的求和问题,就等同于单链表的插入问题,构造一个pc来保存pa+pb的值,为实现处理,用qa,qb,qc分别来表示pa,pb,pc的当前项,由此,得到以下运算过则:
  • qa->exp<qb->exp,将qa复制到qc当中,qa指针后移
  • qa->exp=qb->exp,则将两个节点中的系数相加,当和不为0时,qc的系数等于qa和qb的系数之和,当和为0时,qa,qb指针后移。
  • qa->exp>qb-exp,将qb复制到qc当中,qb指针后移
  • 4.两个多项式相减:和加类似,只需输入系数时奖多项式二的系数改为负的即可,再进行加运算。
  • 5.两个多项式相乘:和多项式相加类似,需要使用多项式pa中的每一项和pb中的每一项进行相乘,然后进行多项式相加操作。
  • 6.多项式求导:多项式当前指数为零,则其导数为零;当前结点指数不为零,则其导数的系数为当前节点指数乘以系数,指数为当前结点指数减一

#include<stdio.h>

#include<stdlib.h>
#include<conio.h>
#include<string.h>
typedef struct node
{
float xishu;
int zhishu;
struct node *next;
}Lnode;
Lnode *create()
{
Lnode *H;
H=(Lnode*)malloc(sizeof(Lnode));
H->next=NULL;
Lnode *r=H,*s;
int y;
float x;
printf("请输入系数和指数:\n");
scanf("%f %d",&x,&y);
while(x!=0.0)
{
s=(Lnode*)malloc(sizeof(Lnode));
s->xishu=x;
s->zhishu=y;
s->next=r->next;
r->next=s;
r=s;
scanf("%f %d",&x,&y);

s->next=NULL; 
return H;
}
/******************************************************/
void print(Lnode *H)                               //输出多项式 
{
Lnode *p=H->next;
int flag=1;
if(!p)
{
printf("0");
return;
getch();
}
while(p)
{
if(p->xishu>0&&flag!=1) putchar('+');
if(p->xishu!=1&&p->xishu!=-1)
{
printf("%g",p->xishu);
if(p->zhishu==1) putchar('X');
else if(p->zhishu) printf("X^%d",p->zhishu);
}
else
{
if(p->xishu==1)
{
if(!p->zhishu) printf("1");
else if(p->zhishu==1) printf("X");
else printf("X^%d",p->zhishu);
}
if(p->xishu==-1)
{
if(!p->zhishu) printf("-1");
else if(p->zhishu==-1) printf("-X");
else printf("-X^%d",p->zhishu);
}
}
p=p->next;
flag++;
}
printf("\n");
}
/**************************************************************/
Lnode *MPLUS(Lnode*pa,Lnode *pb)                        //多项式加法 
{
Lnode *Pa,*Pb,*Pc,*pc,*qc;
Pa=pa->next;
Pb=pb->next;
pc=(Lnode*)malloc(sizeof(Lnode));
pc->next=NULL;
Pc=pc; 
while(Pa!=NULL&&Pb!=NULL)
{
qc=(Lnode*)malloc(sizeof(Lnode));
if(Pa->zhishu<Pb->zhishu)
{
qc->xishu=Pa->xishu;
qc->zhishu=Pa->zhishu;
Pa=Pa->next; 
}
    else if(Pa->zhishu==Pb->zhishu)
    {
      qc->xishu=Pa->xishu+Pb->xishu;
      qc->zhishu=Pa->zhishu;
      Pa=Pa->next;
      Pb=Pb->next;
    } 
    else 
    {
        qc->xishu=Pb->xishu;
qc->zhishu=Pb->zhishu;
Pb=Pb->next;
}
if(qc->xishu!=0)
{
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
else free(qc);
}
while(Pa != NULL)
{
qc=(Lnode*)malloc(sizeof(Lnode));
qc->xishu=Pa->xishu;
qc->zhishu=Pa->zhishu;
Pa=Pa->next;
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
while(Pb != NULL)
{
qc=(Lnode*)malloc(sizeof(Lnode));
qc->xishu=Pb->xishu;
qc->zhishu=Pb->zhishu;
Pb=Pb->next;
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
return Pc;
}
/**************************************************************/
Lnode *MDele(Lnode *pa,Lnode *pb)                   //多项式减法     ;
{
Lnode *h=pb;
Lnode *p=pb->next;
    Lnode *pd;
while(p)
{
p->xishu*=-1.0;
p=p->next;
    } 
        pd = MPLUS(pa,h);
   for(p=h->next;p;p=p->next)
        p->xishu*=-1;                                     
    return pd;

/********************************************************************/
Lnode *multi(Lnode*pa,Lnode *pb)                        //多项式乘法 
{
Lnode *Pa,*Pb,*Pc,*pc,*qc;
Pa=pa->next;
Pb=pb->next;
pc=(Lnode*)malloc(sizeof(Lnode));
pc->next=NULL;
Pc=pc; 
while(Pa!=NULL)
{
Pb=pb->next;
while(Pb!=NULL)
{
qc=(Lnode*)malloc(sizeof(Lnode));
qc->xishu=Pa->xishu*Pb->xishu;
qc->zhishu=Pa->zhishu+Pb->zhishu;
qc->next=pc->next;
pc->next=qc;
pc=qc;
Pb=Pb->next;
  }
if(qc->xishu==0)  
free(qc); 
   Pa=Pa->next;
}
return Pc;
}
Lnode *F(Lnode *pa)           //多项式求导 
{
Lnode *P,*qc,*Pc,*pc;
pc=(Lnode*)malloc(sizeof(Lnode));
pc->next=NULL;
P=pa->next;
Pc=pc;
while(P!=NULL)
{
qc=(Lnode*)malloc(sizeof(Lnode));
if(P->zhishu!=0)
{
qc->zhishu=P->zhishu-1;
qc->xishu=P->xishu*P->zhishu;
   }
   if(P->zhishu==0)
   {
qc->xishu=P->xishu;
qc->zhishu=0;
   }
   if(qc->xishu!=0)
   {
   qc->next=pc->next;
pc->next=qc;
pc=qc;
}
if(qc->xishu==0)
free(qc);
P=P->next; 
    }
    return Pc;

void main()                                   //多项式必须按次数由低到高或由高到低输入 
{
Lnode *pa,*pb,*Plus,*jian,*Multi,*f;      //输入多项式 
printf("输入多项式一:\n");            
pa=create();
printf("多项式一如下:\n");
printf("Pa=");
print(pa);
    printf("\n");
    
printf("输入多项式二:\n");
    pb=create();
printf("多项式二如下:\n");
printf("Pb=");
print(pb);
getch();

printf("\n");                    //多项式加法
Plus=MPLUS(pa,pb);
printf("两式相加结果为:\n");
printf("Pc=");
print(Plus);                     
                               
printf("两式相减的结果为:\n");         //多项式减法 
printf("Pc=");
jian=MDele(pa,pb);
print(jian); 
printf("\n"); 

printf("两式相乘的结果为:\n");           //多项式乘法 
printf("Pc=");
Multi=multi(pa,pb);
print(Multi);   

printf("\n一式求导得:\n");           //多项式求导 
printf("Pa'=");
f=F(pa) ;
print(f);   
printf("\n");   

printf("二式求导得:\n");           //多项式求导 
printf("Pb'=");
f=F(pb);
print(f);     
}
  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
数据结构是计算机科学中研究数据组织、存储和管理的一门学科。一元多项式是数学中的概念,它由一个变量和对应的系数构成。一元多项式运算器是一个能够对一元多项式进行各种运算的程序或工具。 在Java中实现一元多项式运算器,可以使用链表或数组等数据结构来表示和存储多项式。以下是一个简单的示例代码: ```java import java.util.*; class Term { int coefficient; int exponent; public Term(int coefficient, int exponent) { this.coefficient = coefficient; this.exponent = exponent; } } class Polynomial { List<Term> terms; public Polynomial() { terms = new ArrayList<>(); } public void addTerm(int coefficient, int exponent) { terms.add(new Term(coefficient, exponent)); } public Polynomial add(Polynomial other) { Polynomial result = new Polynomial(); result.terms.addAll(this.terms); for (Term term : other.terms) { boolean found = false; for (Term existingTerm : result.terms) { if (existingTerm.exponent == term.exponent) { existingTerm.coefficient += term.coefficient; found = true; break; } } if (!found) { result.terms.add(term); } } return result; } public Polynomial multiply(Polynomial other) { Polynomial result = new Polynomial(); for (Term term1 : this.terms) { for (Term term2 : other.terms) { int coefficient = term1.coefficient * term2.coefficient; int exponent = term1.exponent + term2.exponent; result.addTerm(coefficient, exponent); } } return result; } public void print() { for (Term term : terms) { System.out.print(term.coefficient + "x^" + term.exponent + " + "); } System.out.println(); } } public class PolynomialCalculator { public static void main(String[] args) { Polynomial p1 = new Polynomial(); p1.addTerm(2, 3); p1.addTerm(4, 2); p1.addTerm(1, 0); Polynomial p2 = new Polynomial(); p2.addTerm(3, 2); p2.addTerm(1, 1); p2.addTerm(5, 0); Polynomial sum = p1.add(p2); Polynomial product = p1.multiply(p2); System.out.println("Sum:"); sum.print(); System.out.println("Product:"); product.print(); } } ``` 这个示例代码实现了一个简单的一元多项式运算器,可以进行多项式的加法和乘法运算。你可以根据需要扩展该代码,添加其他运算功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值