一元多项式的表示及加减乘除运算

例如:如何实现用线性链表表示多项式的加法运算?

根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项;对于两个一元多项式中所有指数不相同的项,则分别复抄到“和多项式”中去。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>  

typedef struct polyn
{
    float coef;
    int expn;
    struct polyn* next;
}PolyNode,*PLinkList;  

PLinkList CreatePolyn();//创建一元多项式,使一元多项式呈指数递减
void OutPut(PLinkList head);//输出一元多项式
PLinkList Addition(PLinkList L1,PLinkList L2);//多项式的加法
PLinkList Subtraction(PLinkList L1,PLinkList L2);//多项式的减法
PLinkList Reverse(PLinkList head);//将生成的链表逆置,使一元多项式呈指数递增形式
PLinkList MultiplyPolyn(PLinkList L1,PLinkList L2);//多项式的乘法 

#include "test.h"  

PLinkList CreatePolyn()//创建一元多项式,使一元多项式呈指数递减
{
    PolyNode *p,*q,*s;
    PolyNode *head = NULL;
    int expn2;
    float coef2;
    head = (PLinkList)malloc(sizeof(PolyNode));//动态生成头结点
    if(!head)
    {
        return NULL;
    }
    head->coef = 0.0;//初始化
    head->expn = 0;
    head->next = NULL;
    do
    {
        printf("输入系数coef(系数和指数都为0结束)");
        scanf("%f",&coef2);
        printf("输入指数数exp(系数和指数都为0结束)");
        scanf("%d",&expn2);
        if((long)coef2 == 0 && expn2 == 0)
        {
            break;
        }
        s = (PLinkList)malloc(sizeof(PolyNode));
        if(!s)
        {
            return NULL;
        }
        s->expn = expn2;
        s->coef = coef2;
        q = head->next ;
        p = head;
        while(q && expn2 < q->expn)
        {
            p = q;
            q = q->next ;
        }
        if(q == NULL || expn2 > q->expn)
        {
            p->next = s;
            s->next = q;
        }
        else
        {
            q->coef += coef2;
        }
    }while(1);
    return head;
}  

void OutPut(PLinkList head)//输出一元多项式
{
    PolyNode *p = head->next ;
    while(p)
    {
        printf("%1.1f",p->coef);
        if(p->expn)
        {
            printf("*x^%d",p->expn);
        }
        if(p->next && p->next->coef > 0)
        {
            printf("+");
        }
        p = p->next ;
    }
}  

PolyNode *Addition(PLinkList L1,PLinkList L2)//多项式的加法
{
    PolyNode *pa,*pb,*pc,*u,*head;
    head = (PLinkList)malloc(sizeof(PolyNode));
    if(!head)
    {
        return NULL;
    }
    head->coef = 0.0;
    head->expn = 0;
    head->next = NULL;
    pc = head;
    L2 = Reverse(L2);
    pa = L1->next ;
    pb = L2->next ;
    while(pa != NULL && pb != NULL)
    {
        if(pa->expn == pb->expn)
        {
            u = (PLinkList)malloc(sizeof(PolyNode));
            if(!u)
            {
                return NULL;
            }
            u->coef = pa->coef + pb->coef ;
            u->expn = pa->expn ;
            pa = pa->next ;
            pb = pb->next ;
            u->next = pc->next ;
            pc->next = u;
            pc = u;
        }
        else if(pa->expn > pb->expn)
        {
            u = (PLinkList)malloc(sizeof(PolyNode));
            if(!u)
            {
                return NULL;
            }
            u->coef = pa->coef ;
            u->expn = pa->expn ;
            pa = pa->next ;
            u->next = pc->next ;
            pc->next = u;
            pc = u;
        }
        else
        {
            u = (PLinkList)malloc(sizeof(PolyNode));
            if(!u)
            {
                return NULL;
            }
            u->coef = pb->coef ;
            u->expn = pb->expn ;
            pb = pb->next ;
            u->next = pc->next ;
            pc->next = u;
            pc = u;
        }
    }
    L2 = Reverse(L2);
    return head;
}  

PolyNode *Subtraction(PLinkList L1,PLinkList L2)//多项式的减法
{
    PolyNode *pa,*pb,*pc,*u,*head;
    head = (PLinkList)malloc(sizeof(PolyNode));
    if(!head)
    {
        return NULL;
    }
    head->coef = 0.0;
    head->expn = 0;
    head->next = NULL;
    pc = head;
    pa = L1->next ;
    pb = L2->next ;
    while(pa != NULL && pb != NULL)
    {
        if(pa->expn == pb->expn)
        {
            u = (PLinkList)malloc(sizeof(PolyNode));
            if(!u)
            {
                return NULL;
            }
            u->coef = pa->coef - pb->coef ;
            u->expn = pa->expn ;
            pa = pa->next ;
            pb = pb->next ;
            u->next = pc->next ;
            pc->next = u;
            pc = u;
        }
        else if(pa->expn > pb->expn)
        {
            u = (PLinkList)malloc(sizeof(PolyNode));
            if(!u)
            {
                return NULL;
            }
            u->coef = pa->coef ;
            u->expn = pa->expn ;
            pa = pa->next ;
            u->next = pc->next ;
            pc->next = u;
            pc = u;
        }
        else
        {
            u = (PLinkList)malloc(sizeof(PolyNode));
            if(!u)
            {
                return NULL;
            }
            u->coef = pb->coef ;
            u->expn = pb->expn ;
            pb = pb->next ;
            u->next = pc->next ;
            pc->next = u;
            pc = u;
        }
    }
    return head;
}  

PolyNode *Reverse(PLinkList head)//将生成的链表逆置,使一元多项式呈指数递增形式
{
    PolyNode *q,*r,*p = NULL;
    q = head->next ;
    while(q)
    {
        r = q->next ;
        q->next = p;
        p = q;
        q = r;
    }
    head->next = p;
    return head;
}  

PolyNode *MultiplyPolyn(PLinkList L1,PLinkList L2)//多项式的乘法
{
    PolyNode *pa,*pb,*pc,*u,*head;
    int k,maxExp;
    float coef;
    head = (PLinkList)malloc(sizeof(PolyNode));
    if(!head)
    {
        return NULL;
    }
    head->coef = 0.0;
    head->expn = 0;
    head->next = NULL;
    if(L1->next != NULL && L2->next != NULL)
    {
        maxExp = L1->next->expn +L2->next->expn ;
    }
    else
    {
        return head;
    }
    pc = head;
    L2 = Reverse(L2);
    for(k = maxExp;k >= 0;k--)
    {
        pa = L1->next ;
        while(pa != NULL && pa->expn > k)
        {
            pa = pa->next ;
        }
        pb = L2->next ;
        while(pb != NULL && pa != NULL && pa->expn+pb->expn < k)
        {
            pb= pb->next ;
        }
        coef = 0.0;
        while(pa != NULL && pb != NULL)
        {
            if(pa->expn +pb->expn == k)
            {
                coef += pa->coef *pb->coef ;
                pa = pa->next ;
                pb = pb->next ;
            }
            else if(pa->expn +pb->expn > k)
            {
                pa = pa->next ;
            }
            else
            {
                pb = pb->next ;
            }
        }
        if(coef != 0.0)
        {
            u = (PLinkList)malloc(sizeof(PolyNode));
            u->coef = coef;
            u->expn = k;
            u->next = pc->next ;
            pc->next = u;
            pc = u;
        }
    }
    L2 = Reverse(L2);
    return head;
}  

#include "test.h"  

int main(void)
{
    PLinkList A,B,C,D,E;
    A = CreatePolyn();
    printf("A(x) =");
    OutPut(A);
    printf("\n");
    B = CreatePolyn();
    printf("B(x) =");
    OutPut(B);
    printf("\n");
    C = MultiplyPolyn(A,B);
    printf("C(x) = A(x)*B(x) =");
    OutPut(C);
    printf("\n");
    D = Addition(A,B);
    printf("D(x) = A(x)+B(x) =");
    OutPut(D);
    printf("\n");
    E = Subtraction(A,B);
    printf("E(x) = A(x)-B(x) =");
    OutPut(E);
    printf("\n");
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-09 10:43:42

一元多项式的表示及加减乘除运算的相关文章

[PAT] 一元多项式的乘法与加法运算 C语言实现

[PAT] 02-线性结构1 一元多项式的乘法与加法运算 设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数.数字间以空格分隔,但结尾不能有多余空格.零多项式应输出0 0. 输入样例: 4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1 输出

简单工厂模式--加减乘除运算

学习来自<大话设计模式> 下面基于简单的<加减乘除运算>实例来讲讲实用简单工厂模式:<备注:以后根据认识的加深,可以添加和修改内容> 需求分析:希望程序提供“加减乘除”四种功能. 功能分析:四种功能都是并列的,相互独立的. 拓展分析:很有可能拓展新的功能,比如“开根运算”. 如何设计: 1.根据“功能分析”可以将四种功能都归并一个父类出来,然后创建四个子类继承它,并且提供空的方法(OC中模拟抽象方法或者虚函数),这四个子类分别都要继承并重写实现这个空方法.这样,一个抽象

02-线性结构2 一元多项式的乘法与加法运算 (20 分)

02-线性结构2 一元多项式的乘法与加法运算 (20 分) 设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数.数字间以空格分隔,但结尾不能有多余空格.零多项式应输出0 0. 输入样例: 4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1 输

7-22 一元多项式的乘法与加法运算 (20 分)

7-22 一元多项式的乘法与加法运算 (20 分) 设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数.数字间以空格分隔,但结尾不能有多余空格.零多项式应输出0 0. 输入样例: 4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1 输出样例:

利用JavaScript实现加减乘除运算

一.问题:利用JavaScript写一个加减乘除运算,输入两个数,判断下拉列框的运算符号,进行相应的运算 二.首先,我利用JavaScript实现简单加法运算,代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="

精确的double加减乘除运算工具类

import java.math.BigDecimal; /** * 精确的double加减乘除运算 * @author cyf * */ public class DoubleUtil { /** * 提供精确的加法运算. * * @param v1 * 被加数 * @param v2 * 加数 * @return 两个参数的和 */ public static double add(double v1, double v2) { BigDecimal b1 = new BigDecimal(

&quot;Coding Interview Guide&quot; -- 只用位运算不用算术运算实现整数的加减乘除运算

[题目] 给定两个32位整数a和b,可正.可负.可0,不能使用算术运算符,分别实现a和b的加减乘除运算 [要求] 如果给定的a和b执行加减乘除的某些结果本来就会导致数据的溢出,那么你实现的函数不必对那些结果负责 加法运算:a + b = (a ^ b) + ((a & b) << 1) 1 public int add(int a, int b) 2 { 3 int sum = a; 4 while(b != 0) 5 { 6 sum = a ^ b; // 不带进位的加法 7 b =

BigDecimal加减乘除运算

java.math.BigDecimal.BigDecimal一共有4个够造方法,让我先来看看其中的两种用法: 第一种:BigDecimal(double val)Translates a double into a BigDecimal. 第二种:BigDecimal(String val)Translates the String repre sentation of a BigDecimal into a BigDecimal. 使用BigDecimal要用String来够造,要做一个加法

JS最基础的获取元素的值实现加减乘除运算

<!doctype html> <html> <head> <meta charset="utf-8"> <title>事件</title> <link href="css.css" rel="stylesheet" type="text/css"/> </head> <body> <div id="co