C语言实现多项式除法

这是一个C语言实现多项式除法的代码实例,多项式除法和多项式加减乘不同,比较难以实现,所以一直是各个教材和老师避讳的,故小可今天现丑将其算法和代码贴出,算法和效率上我也不甚满意,虽不免遗笑于方家,但本着学习进步的原则,希望能得到诸君点拨。

大概描述:用被除数的最大项除以除数最大项,然后用这个商遍乘除数,其间要申请式子的拷贝,然后被除数再减遍乘过后的那个积,差又是下一轮的被除数,如此直到最后被除数幂小于除数,可能说的不很清楚,全部代码如下(通过turboc调试成功):

#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
typedef struct LinkList{
float coef;
int expn;
struct LinkList* next;
}LinkList,*PLink;
void AddPolyn(PLink *p1,PLink p2);
void SubPolyn(PLink *p1,PLink p2);
void MulPolyn(PLink *p1,PLink p2);
int cmp(int,int);
void Del(PLink*,PLink);
void Ins(PLink*,PLink);
void Append(PLink*,PLink);
void DevPolyn(PLink*,PLink*);
void Destroy(PLink*);
PLink GetMax(PLink);
void CreatePolyn(PLink *p)
{
int m;
float b;
PLink s;
printf("\nHow many polynomial:");
scanf("%d",&m);
printf("Enter the expn from large to small:");
for(m;m>0;m--)
{
s=(PLink)malloc(sizeof(LinkList));
printf("\nEnter the coef:");
scanf("%f",&b);
s->coef=b;
printf("\nEnter the expn:");
scanf("%d",&(s->expn));
s->next=(*p)->next;
(*p)->next=s;
}
}
void PrintPolyn(PLink p)
{
PLink q=p->next;
while(q!=0)
{
printf("%3.1fx^%d+",q->coef,q->expn);
q=q->next;
}
if(q==p->next)
printf("0");
}
main()
{
PLink p1=(PLink)malloc(sizeof*p1);
PLink p2=(PLink)malloc(sizeof*p2);
p1->next=p2->next=0;
p1->coef=p1->expn=p2->coef=p2->expn=0;
printf("\nBuild the p1\n");
CreatePolyn(&p1);
PrintPolyn(p1);
printf("\nBuild the p2\n");
CreatePolyn(&p2);
PrintPolyn(p2);
DevPolyn(&p1,&p2);printf("\n");
PrintPolyn(p1);
printf("\nthe surplus is:\n");
PrintPolyn(p2);
Destroy(&p1);
Destroy(&p2);
getch();
}
void AddPolyn(PLink *p1,PLink p2)//加法
{
PLink qa=(*p1)->next,ha=*p1;
PLink qb=p2->next,hb;
int a,b;
while(qa&&qb)
{
a=qa->expn;
b=qb->expn;
switch(cmp(a,b))
{
case -1:
ha=qa;qa=qa->next;break;
case 0:
qa->coef+=qb->coef;
if(qa->coef!=0)ha=qa;
else Del(&ha,qa);
qa=ha->next;
qb=qb->next;break;
case 1:
hb=(PLink)malloc(sizeof*hb);//注意:这里是加入一个拷贝,而不是改变一个链接
hb->coef=qb->coef;
hb->expn=qb->expn;
Ins(&ha,hb);
qb=qb->next;
ha=ha->next;
break;
}
}
if(qb!=0)Append(&ha,qb);
}
void SubPolyn(PLink *p1,PLink p2)
{
PLink qa=(*p1)->next,ha=*p1;
PLink qb=p2->next,hb;
int a,b;
while(qa&&qb)
{
a=qa->expn;
b=qb->expn;
switch(cmp(a,b))
{
case -1:
ha=qa;qa=qa->next;break;
case 0:
qa->coef-=qb->coef;
if(qa->coef!=0)ha=qa;
else Del(&ha,qa);
qa=ha->next;
qb=qb->next;break;
case 1:
hb=(PLink)malloc(sizeof*hb);
hb->coef=-1*qb->coef;
hb->expn=qb->expn;
Ins(&ha,hb);
qb=qb->next;
ha=ha->next;
break;
}
}
if(qb!=0)Append(&ha,qb);
ha=ha->next;
while(ha!=0)
{
ha->coef*=-1;
ha=ha->next;
}
}
void MulPolyn(PLink *p1,PLink p2)
{
PLink temp,res,qa,qb=p2->next;
res=(PLink)malloc(sizeof*res);
res->coef=res->expn=0;
res->next=0;
while(qb!=0)
{
temp=(PLink)malloc(sizeof*temp);
temp->coef=temp->expn=0;
temp->next=0;
AddPolyn(&temp,*p1);
qa=temp->next;
while(qa!=0)
{
qa->coef*=qb->coef;
qa->expn+=qb->expn;
qa=qa->next;
}
AddPolyn(&res,temp);
Destroy(&temp);
qb=qb->next;
}
temp=*p1;
*p1=res;
Destroy(&temp);
}
void DevPolyn(PLink *p1,PLink *p2)
{
PLink res2,temp1,temp2,q;
res2=(PLink)malloc(sizeof(*res2));//res2用来暂存商
res2->coef=res2->expn=0;res2->next=0;
while(GetMax(*p1)!=0&&GetMax(*p1)->expn>=GetMax(*p2)->expn)
{
temp2=(PLink)malloc(sizeof*temp2);
temp1=(PLink)malloc(sizeof(LinkList));
temp1->coef=temp1->expn=0;
temp1->next=0;
temp2->coef=(GetMax(*p1)->coef)/(GetMax(*p2)->coef);
temp2->expn=(GetMax(*p1)->expn)-(GetMax(*p2)->expn);
AddPolyn(&temp1,*p2);//temp1是p2的一个拷贝,p2在此期间一直不变
q=temp1->next;
Ins(&res2,temp2);
while(q!=0)//除数的遍乘
{
q->coef*=temp2->coef;
q->expn+=temp2->expn;
q=q->next;
}
SubPolyn(p1,temp1);//被除数减去遍乘后的积
Destroy(&temp1);
}
temp1=*p1;
temp2=*p2;
*p1=res2;*p2=temp1;
Destroy(&temp2);
}
int cmp(int a,int b)
{
if(a>b)return 1;
if(a<b)return -1;
return 0;
}
void Del(PLink *p,PLink pa)
{
(*p)->next=pa->next;
free(pa);
}
void Ins(PLink *p,PLink pa)
{
pa->next=(*p)->next;
(*p)->next=pa;
}
void Append(PLink *p,PLink pa)
{
PLink temp,end=*p;
while(pa!=0)
{
temp=(PLink)malloc(sizeof(LinkList));
temp->coef=pa->coef;
temp->expn=pa->expn;
temp->next=0;
end->next=temp;
end=temp;
pa=pa->next;
}
}
void Destroy(PLink *p)//注意,这里destroy将free掉头结点
{
while((*p)->next!=0)
Del(p,(*p)->next);
free(*p);
}
PLink GetMax(PLink p)
{
PLink q=p->next;
if(q!=0)
while(q->next!=0)
q=q->next;
else
return 0;
return q;
}

时间: 2024-09-14 01:24:02

C语言实现多项式除法的相关文章

c语言编程 多项式加法-c语言编程中求多项式加法

问题描述 c语言编程中求多项式加法 多项式加法(5分) 题目内容: 一个多项式可以表达为x的各次幂与系数乘积的和,比如: 2x6+3x5+12x3+6x+20 现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出. 程序要处理的幂最大为100. 输入格式: 总共要输入两个多项式,每个多项式的输入格式如下: 每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,所有的系数都是整数.第一行一定是最高幂,最后一行一定是0次幂. 注意第一行和最后一行之间不一

mov-汇编语言几种除法的区别

问题描述 汇编语言几种除法的区别 idiv 和fdiv有什么区别 1820: i = i / 0.0; //为什么改成 i = i / 0.0;就不报错? 004015DF fild dword ptr [ebp-4 004015E2 fdiv qword ptr [__real@8@00000000000000000000 (0046fce8) 004015E8 call __ftol (00401c80 004015ED mov dword ptr [ebp-4],eax 1820: i =

使用C语言实现CRC校验的方法_C 语言

CRC(Cyclic Redundancy Check)校验应用较为广泛,以前为了处理简单,在程序中大多数采用LRC(Longitudinal Redundancy Check)校验,LRC校验很好理解,编程实现简单.用了一天时间研究了CRC的C语言实现,理解和掌握了基本原理和C语言编程.结合自己的理解简单写下来. 1.CRC简介 CRC检验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个检验码r位(就是CRC码),附在信息后面,构成一个新的二进制码序列数

Matlab中数据处理和多项式插值与曲线拟合

一.  基本统计处理 1.查取最大值MAX函数的命令格式有:[Y,I]= max (X):将max(X)返回矩阵X的各列中的最大元素值及其该元素的位置赋予行向量Y与I:当X为向量时,则Y与I为单变量.[Y,I]=max(X,[],DIM):当DIM=1时按数组X的各列查取其最大的元素值及其该元素的位置赋予向量Y与I;当DIM=2时按数组X的各行查取其最大的元素值及其该元素的位置赋予向量Y与I.max(A,B):返回一个与A,B同维的数组,其每一个元素是由A,B同位置上的元素的最大值组成. [例1

《计算机网络课程设计(第2版)》——3.5节相关扩展

3.5 相关扩展 除了上面介绍的方法之外,还有其他一些算法可以完成CRC校验.例如,多项式除法可用除法电路来实现.除法电路的主体由一组移位寄存器和模2加法器(异或单元)组成.以CRC-ITU为例,它由16级移位寄存器和3个加法器组成,图3-5给出了除法电路实现CRC的示意图(编码/解码共用).编码.解码前将各寄存器初始化为"1",信息位按照时钟周期依次移入.当信息位全部输入后,从寄存器组输出CRC结果. 1. 比特型算法 上面的CRC-ITU除法电路可以用软件来模拟.定义一个寄存器组,

大师告诉你,学习数学有什么用

数学知识什么时候能派上用场呢? 在地球上某个地方的一间教室里,一位数学老师布置了30 道定积分练习题作为学生的周末作业.要做完这些题,肯定需要花费大量时间,因此,一名学生大声地表达了自己的疑惑.他问了老师最不愿意回答的问题:"这些知识我什么时候能用上呢?" 这位老师很可能会这样回答:"我知道这些题目非常枯燥,可是你别忘了,你还不知道自己将来会选择什么样的职业.现在,你看不到这些知识与你有什么关系,但是你将来从事的职业有可能非常需要这些知识,所以你应该快速准确地完成这些定积分练

线性代数中的数值计算问题

1.AX=b A\b或者inv(A)*b 一. 特殊矩阵的实现 常见的特殊矩阵有零矩阵.幺矩阵.单位矩阵.三角形矩阵等,这类特殊矩阵在线性代数中具有通用性:还有一类特殊矩阵在专门学科中有用,如有名的希尔伯特(Hilbert)矩阵.范德蒙(Vandermonde) 矩阵等. 1.零矩阵:所有元素值为零的矩阵称为零矩阵.零矩阵可以用zeros函数实现.zeros是MATLAB内部函数,使用格式如下:zeros(m):产生m× m阶零矩阵:zeros(m,n):产生m ×n阶零矩阵,         

CRC校验

1.循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定. 2.生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为'0'和'1'取值的多项式一一对应.例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111. 3.CRC码集选择的原则:若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式

CRC与MD5的异同

php中CRC32的用法: crc32 - 计算一个字符串的 crc32 多项式 生成 string 参数的 32 位循环冗余校验码多项式--: 这句话从英文翻译过来的,不正确,准确的说应该是这么理解: 以32位循环冗余校验多项式算法,来计算一个字符串,返回一个(可能带符号的)整数. 使用方法: 这个函数的功能类似于md5算法.sha1算法加密.这个函数的使用过程中,需要多考虑取返回的整数的绝对值就可以了. 至于如何能做到检查传输的数据是否完整: 参考md5的常见使用场景. 32位循环冗余校验多