一元多项式的相加、相乘

2024-06-03 19:32
文章标签 相加 多项式 一元 相乘

本文主要是介绍一元多项式的相加、相乘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#define null 0

#include "stdio.h"
#include "stdlib.h"
#include "math.h"

typedef struct
{
 float coef;//系数
 int expn;//指数
}term;//代表一元多项式的一项
typedef struct Lnode
{
 term data;//链表的一个结点存放一项
 Lnode * next;
}* Link,* Polynomial;//Polynomial代表一元多项式

int cmp(term a,term b)//比较a.b的指数
{
 if (a.expn==b.expn) return 0;//如果两项指数相等,返回0
 else return (a.expn-b.expn)/abs(a.expn-b.expn);//如果a的指数 > b的指数返回一个大于0 的值,如果a的指数< b的指数返回一个小于0 的值,abs(a.expn-b.expn)本身大于0,
}
void PrintPolyn(Polynomial p)//输出显示一元多项式p
{
 Link q;
 q = p->next;
 printf("\n################## 系数    指数 #################\n");
 while(q)
 {
  printf("                %8.2f    %-d\n",q->data.coef,q->data.expn);
  q = q->next;
 }
}
void Orderinsert(Polynomial &L,term e)//在L的合适位置插入e
{
 Link o,p,q;
 q = L;//q指向L,存放L的地址
 p=q->next;//p指向L第一个有效项
 while ( p && cmp(p->data,e)<0 )//如果e的指数比p所指向的项的指数小,则指针p后移
 {
  q = p;//q跟踪p
  p = p->next;
 }
 if( p && 0 == cmp(p->data,e) ) //如果e的指数和p所指向的项的指数相等,则将两项合并
 {
  p->data.coef += e.coef ;//系数相加,指数不变
  return ;
 }
 else//当前p所指向的项指数比e的大,将新结点插入L
 {
  o = (Link)malloc(sizeof(Lnode));//分配新结点
  o->data = e;//为新结点赋值
  q->next = o;//q指向新结点
  o->next = p;//新结点指向p所指向的项
  return;
 }
 
}
void CreatPolyn (Polynomial &L,int m)//创建p,里面含m项
{
 term e;//定义一元多项式的一项e
 int i;
 L = (Link)malloc(sizeof(Lnode));//分配一个结点
 L->next = null;

 printf("\n请输入%d个系数和指数用空格符间隔:\n",m);
 for(i=1;i<=m;i++)
 {
  scanf("%f%d",&e.coef,&e.expn);//得到e的系数和指数
  Orderinsert(L,e);//将e插到一元多项式p的合适位置
 }
}
void AddPolyn(Polynomial &La,Polynomial Lb)
{
 Link pb;//指向Lb
 term b;
 pb = Lb->next;
 while(pb)
 {
  b = pb->data; //用来存放Lb每项数据
  Orderinsert(La,b);//将b插入La中
  pb = pb->next;
 }

 printf("\n***************两个多项式相加后的多项式为:***************\n");
 PrintPolyn(La);  //输出相加后的一元多项式/

 free(pb); //销毁链表Lb
}

void MultiplyPolyn(Polynomial La,Polynomial Lb)
{
 Polynomial Lc = (Link)malloc(sizeof(Lnode));
 Lc->next = null;//创建一个新的链表,存放相乘后的多项式

 Link pa,pb;//pa,pb用来指向La,Lb
 term temp;//存放临时项

 for(pb = Lb->next; pb ; pb = pb->next)
 //Lb的每一项都与 多项式La相乘
  for(pa = La->next; pa; pa = pa->next )
  {
   temp.coef = pa->data.coef * pb->data.coef;//系数相乘,指数相加
   temp.expn = pa->data.expn + pb->data.expn;
   Orderinsert(Lc,temp);///相乘的每一项都放到Lc中
  }
 }

 printf("\n***************两个多项式相乘后的多项式为:****************\n");
 PrintPolyn(Lc);  //输出相乘后的一元多项式/
 free(Lb);//销毁La,Lb
 free(La);
}

int main()
{
 system("mode con cols=65 lines=35");//设置窗口大小
 system("COLOR f1");//设置窗口颜色

 int door=1,num;

 while( door )
 {
  printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
  printf("       如要对顺序表进行操作,请输入各项前面相应的数字\n");
  printf("          ************************************\n");
  printf("            1、两个一元多项式相加     |\n");
  printf("            2、两个一元多项式相乘     |\n");
  printf("            0、退出                   |\n");
  printf("          ************************************\n");
  printf(" 请输入数字进行操作:");
  scanf("%d",&num);

  switch(num)
  {
   case 1: //加法
    Polynomial L1,L2;//定义两个链表代表两个一元多项式
    CreatPolyn(L1,5);//创建L1,里面含5项
    PrintPolyn(L1);//输出L1
    CreatPolyn(L2,3);//创建L2,里面含3项
    PrintPolyn(L2);//输出L2
    AddPolyn(L1,L2);  //两个一元多项式相加
    break;
   case 2: //乘法
    Polynomial L3,L4;//定义两个链表代表两个一元多项式
    CreatPolyn(L3,5);//创建L3,里面含5项
    PrintPolyn(L3);//输出L3
    CreatPolyn(L4,3);//创建L4,里面含3项
    PrintPolyn(L4);//输出L4
    MultiplyPolyn(L3,L4);  //两个一元多项式相乘
    break;
   case 0: door = 0; break;
  
 }
 return 0;
}

这篇关于一元多项式的相加、相乘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1027900

相关文章

javaScript日期相加减例子

当前时间加上2天 var d = new Date(“2015-7-31”); d.setDate(d.getDate()+2); var addTwo=d.getFullYear()+”年”+(d.getMonth()+1)+”月”+d.getDate()+”日”; “控制台输出===============”+”当前日期加2天:”+addTwo; 使用这种方法,月份也会给你计算.

一些数学经验总结——关于将原一元二次函数增加一些限制条件后最优结果的对比(主要针对公平关切相关的建模)

1.没有分段的情况 原函数为一元二次凹函数(开口向下),如下: 因为要使得其存在正解,必须满足,那么。 上述函数的最优结果为:,。 对应的mathematica代码如下: Clear["Global`*"]f0[x_, a_, b_, c_, d_] := (a*x - b)*(d - c*x);(*(b c+a d)/(2 a c)*)Maximize[{f0[x, a, b,

两个长数字相加

1.编程题目 题目:要实现两个百位长的数字直接相加 分析:因为数字太长所以无法直接相加,所以采用按位相加,然后组装的方式。(注意进位) 2.编程实现 package com.sino.daily.code_2019_6_29;import org.apache.commons.lang3.StringUtils;/*** create by 2019-06-29 19:03** @autho

Leetcode面试经典150题-2.两数相加

解法都在代码里,不懂就留言或者私信 理论上提交这个就是最优解 字节考过不下20次,这个高居字节面试榜第9名 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) {

一元分类、二元分类、多类分类、多标签学习

unary classification -- 一元分类 维基百科中的定义是:一类分类,即一元分类,通过仅包含该类的对象的训练数据中学习,试图能够在所有对象中识别该特定类的对象。 one-class classification是由[Moya & Hush][1]在1996年提出的,目前已有很多这方面的研究。一个类似的问题是PU Learning,后者是以半监督的学习方式从正类样本和未标记样本

算法笔记02--归纳法之多项式求值(Horner规则)

多项式求值 假设有n+2个实数a0,a1,...,an和x的序列,求多项式 p_nx = a_nx^n + a_n-1x^n-1 + ...+ a_1x + a_0; 则需要乘法:n+n-1 + ...+2+1 = n(n+1)/2 需要加法:n 可见算法效率为O(n^2) 而p_nx = ((...((((a_n)x + a_n-1)x + a_n-2)x + a_n-3)....)

链表(篇5)用链表实现多项式相加

使用链接实现两个多项式相加 例: 输入:第一数= 5x ^ 2 + 4x ^ 1 + 2x ^ 0第二数= 5x ^ 1 + 5x ^ 0输出:5x ^ 2 + 9x ^ 1 + 7x ^ 0输入:第一数= 5x ^ 3 + 4x ^ 2 + 2x ^ 0第二数= 5x ^ 1 + 5x ^ 0输出:5x ^ 3 + 4x ^ 2 + 5x ^ 1 + 7x ^ 0 代码

算法------四数相加 II (java 版本)

题目: 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -2^28 到 2^28 - 1 之间,最终结果不会超过 2^31 - 1 。例如:输入:A = [

【机器学习】基扩展的基本概念以及其中的多项式回归、样条方法和广义可加模型的简单介绍(含python代码实例)

引言 基扩展是提升模型性能的重要工具,正确选择和应用基扩展方法可以显著提高模型的预测能力和解释性 文章目录 引言一、基扩展1.1 基扩展定义1.2 基扩展方法1.2.1 多项式基扩展1.2.2 样条基扩展1.2.3 径向基函数(RBF)1.2.4 傅里叶基扩展1.2.5 wavelet基扩展1.2.6 单隐藏层神经网络 1.3 应用场景1.4 使用基扩展的注意点 二、多项式回归2.