一元多项式的相乘(代码)

  1 #include <iostream>
  2 #include<stdlib.h>
  3
  4 using namespace std;
  5
  6
  7 #define MAXSIZE 20
  8
  9 typedef struct LNode
 10 {
 11     int coef;//系数
 12     int expn;//指数
 13     struct LNode *next;
 14 }LNode,*LinkList;
 15
 16
 17 int CreateList_L(LinkList &L,int n)
 18 {
 19     LinkList p,q;
 20     for(int i=0;i<n;i++)
 21     {
 22          p=(LinkList)malloc(sizeof(LNode));
 23          cout<<"输入元素系数:";
 24          cin>>p->coef;
 25          cout<<"输入元素指数:";
 26          cin>>p->expn;
 27          if(i==0)L=p;
 28          else q->next=p;
 29          q=p;
 30          p->next=NULL;
 31     }
 32    return 0;
 33 }
 34
 35
 36 int LengthPolyn(LinkList L)//判断多项式的项数
 37 {
 38     int s=0;
 39     while(L)
 40     {
 41         s++;
 42         L=L->next;
 43     }
 44     return s;
 45 }
 46
 47
 48 int CopyList_L(LinkList La,LinkList &Lb)//开辟一段和La指向的空间一样的新的空间,并把La中各元素的值依次复制到Lb中
 49 {
 50     LinkList p,q,pa=La;
 51     int n=LengthPolyn(La);
 52     for(int i=0;i<n;i++)
 53     {
 54          p=(LinkList)malloc(sizeof(LNode));
 55          p->coef=pa->coef;
 56          p->expn=pa->expn;
 57          if(i==0)Lb=p;
 58          else q->next=p;
 59          q=p;
 60          p->next=NULL;
 61          pa=pa->next;
 62     }
 63    return 0;
 64 }
 65
 66
 67
 68 int Display_L(LinkList L)
 69 {
 70     cout<<"f(x)="<<L->coef;
 71     if(L->expn)cout<<"*"<<"x^"<<L->expn;
 72     L=L->next;
 73     while(L)
 74     {
 75         if(L->coef>0)
 76         {
 77             cout<<"+";
 78             cout<<L->coef<<"*"<<"x^"<<L->expn;
 79         }
 80         else cout<<L->coef<<"*"<<"x^"<<L->expn;
 81         L=L->next;
 82     }
 83     return 0;
 84 }
 85
 86
 87
 88 int AddPolyn(LinkList La,LinkList Lb,LinkList &Lc)
 89 {
 90     LinkList pa,pb,p;
 91     int k=1;
 92     pa=La;pb=Lb;
 93     //确定“和多项式”的头结点
 94     while(k)
 95     {
 96          if(pa->expn<pb->expn){p=Lc=pa;pa=pa->next;k=0;}
 97          else if(pa->expn>pb->expn){p=Lc=pb;pb=pb->next;k=0;}
 98          else
 99          {
100              pa->coef+=pb->coef;
101              if(pa->coef)
102              {
103                   p=Lc=pa;
104                   pa=pa->next;
105                   k=0;
106              }
107              else
108              {
109                  pa=pa->next;
110                  pb=pb->next;
111                  if(!pa||!pb) break;
112              }
113          }
114     }
115     if(!pb&&pa){p=Lc=pa;pa=pa->next;}
116     if(!pa&&pb){p=Lc=pb;pb=pb->next;}
117     if(!pa&&!pb) Lc=NULL;
118     //确定接下来的节点
119     while(pa&&pb)
120     {
121         if(pa->expn<pb->expn){p->next=pa;p=pa;pa=pa->next;}
122         else if(pa->expn>pb->expn){p->next=pb;p=pb;pb=pb->next;}
123         else
124         {
125             pa->coef+=pb->coef;
126             if(pa->coef)
127             {
128                   p->next=pa;
129                   p=pa;
130                   pa=pa->next;
131                   pb=pb->next;
132             }
133             else
134             {
135                   pa=pa->next;
136                   pb=pb->next;
137             }
138
139         }
140     }
141     while(!pb&&pa)
142     {
143         p->next=pa;
144         p=pa;
145         pa=pa->next;
146     }
147     while(!pa&&pb)
148     {
149         p->next=pb;
150         p=pb;
151         pb=pb->next;
152     }
153     return 0;
154 }
155
156
157
158 int MultiplyPolyn(LinkList La,LinkList Lb,LinkList &Lc)//La指向的多项式乘以Lb指向的多项式
159 {
160     LinkList pa,pb=Lb,l;
161     int i=0,j,n;
162     LNode *L[MAXSIZE];//指针数组,Lb至多MAXSIZE项!
163     while(pb)
164     {
165         CopyList_L(La,L[i]);
166         pa=L[i];
167         while(pa)
168         {
169             pa->coef*=pb->coef;
170             pa->expn+=pb->expn;
171             pa=pa->next;
172         }
173         pb=pb->next;
174         i++;
175     }
176     n=LengthPolyn(Lb);
177     AddPolyn(L[0],L[1],Lc);
178     for(j=2;j<n;j++)
179     {
180         AddPolyn(L[j],l,Lc);
181         l=Lc;
182     }
183     return 0;
184 }
185
186
187
188 int main()
189 {
190     LinkList La,Lb,Lc;
191     int m,n;
192     cout<<"请输入La中的元素个数:";
193     cin>>m;
194     CreateList_L(La,m);
195     cout<<"请输入Lb中的元素个数:";
196     cin>>n;
197     CreateList_L(Lb,n);
198     MultiplyPolyn(La,Lb,Lc);
199     Display_L(Lc);
200     return 0;
201 }

时间: 2024-10-19 10:14:40

一元多项式的相乘(代码)的相关文章

【链表的应用】一元多项式相加及相乘 和对问题的分析

一元多项式相乘,需要将一个多项式的每一项的指数与另一个多项式的每一项的指数相乘. 代码实现: 头文件以及函数声明: #ifndef _POLYN_H #define _POLYN_H #include<iostream> #include <malloc.h> #include <stdio.h> using namespace std; #define _CRT_SECURE_NO_DEPRECATE #define NULL 0 typedef struct NOD

使用cublas 矩阵库函数实现矩阵相乘

2014-08-10 cublas中执行矩阵乘法运算的函数 首先要注意的是cublas使用的是以列为主的存储方式,和c/c++中的以行为主的方式是不一样的.处理方法可参考下面的注释代码 // SOME PRECAUTIONS: // IF WE WANT TO CALCULATE ROW-MAJOR MATRIX MULTIPLY C = A * B, // WE JUST NEED CALL CUBLAS API IN A REVERSE ORDER: cublasSegemm(B, A)!

矩阵快速幂 模板与简单讲解

模板 快速幂模板 1 void solve(matrix t,long long o) 2 { 3 matrix e; 4 5 memset(e.a,0,sizeof(e.a)); 6 7 for (int i = 0;i < d;i++) 8 e.a[i][i] = 1; 9 10 while (o) 11 { 12 if (o & 1) 13 { 14 e = mul(e,t); 15 } 16 17 o >>= 1; 18 19 t = mul(t,t); 20 } 21

BZOJ-3505-数三角形-CQOI2014

描述 给定一个nxm的网格, 请计算三点都在格点上的三角形共有多少个. 分析 三角形的三个顶点不能共线. 这是入手点. 下面来考虑一个问题, 原点到点(x,y)之间的线段上有几个整点 如果把x, y同除以一个数g保证结果是整数, 那么(x/g, y/g)一定是原点到(x,y)的线段上的整点 原点到(x,y)的线段上的整点中 每两个相邻的之间的距离相等. 而且等于原点到第一个点的距离. 那么找到第一个点就可以知道共有几个了. 比如第一个点(x0,y0). 那么一共x/x0个点. 第一个点, 也就是

算法导论-求(Fibonacci)斐波那契数列算法对比

目录 1.斐波那契数列(Fibonacci)介绍 2.朴素递归算法(Naive recursive algorithm) 3.朴素递归平方算法(Naive recursive squaring) 4 .自底向上算法(Bottom-up) 5. 递归平方算法(Recursive squaring) 6.完整代码(c++) 7.参考资料 内容 1.斐波那契数列(Fibonacci)介绍 Fibonacci数列应该也算是耳熟能详,它的递归定义如上图所示. 下面2-6分别说明求取Fibonacci数列的

树的计数

题目: 1.树的计数 [问题描述] 图和树有很密切的关系.某一天牙神产生了一个很奇怪的想法:删去一些边把一个无向图变成一个树,也就是将边留下 N ? 1 条.而且对于任意一个点 i,要保证现在树中的边满足 1 号点到 i 号点的路径长度等于原图中 1 号点到 i 号点的最短路长度.牙神请你帮忙数一下有多少个目标树满足要求.答案对1000000007 取模. [输入格式] 第一行,一个整数N.接下来 N 行每行 N 个数,第 i 行第 j 个数表示 i 和 j 的连边关系,0 表示没有边. [输出

算法总结之母函数

1.概念 生成函数即母函数,是组合数学中尤其是计数方面的一个重要理论和工具.生成函数有普通型生成函数和指数型生成函数两种,其中普通型用的比较多.形式上说,普通型生成函数用于解决多重集的组合问题,而指数型母函数用于解决多重集的排列问题.母函数还可以解决递归数列的通项问题(例如使用母函数解决斐波那契数列的通项公式). 2.组合问题中的应用 先放两句百度百科上的原话: 1.“把组合问题的加法法则和幂级数的乘幂对应起来” 2.“母函数的思想很简单 — 就是把离散数列和幂级数一 一对应起来,把离散数列间的

[小明学Shader]4.自定义光照----RampTexture

上一篇讲了自定义光照的HalfLambert,这一次和它有些类似,但是计算的时候,不再用方向和atten相乘了. 将光入射方向与法相的点乘积HalfLam作为坐标,找到RampTexture中(HalfLam,HalfLam)点的rgb值作为混合值与s.的Albedo和入射光颜色相乘. 代码如下: Shader"Custom/11.26/2"{ Properties{ _RampTex("Ramp Texture",2D)="white"{} _

递推算法与二分算法

递推算法: (一)斐波那契数列 以下数列0 1 1 2 3 5 8 13 21 …被称为斐波纳契数列. 这个数列从第3项开始,每一项都等于前两项之和. 输入一个整数N,请你输出这个序列的前N项. 输入格式 一个整数N. 输出格式 在一行中输出斐波那契数列的前N项,数字之间用空格隔开. 数据范围 0<N<460<N<46 输入样例: 5 输出样例: 0 1 1 2 3 #include<iostream> using namespace std; int f[100];