数据结构课程设计大数相乘与多项式相乘Word文档格式.doc
- 文档编号:13169097
- 上传时间:2022-10-07
- 格式:DOC
- 页数:17
- 大小:218KB
数据结构课程设计大数相乘与多项式相乘Word文档格式.doc
《数据结构课程设计大数相乘与多项式相乘Word文档格式.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计大数相乘与多项式相乘Word文档格式.doc(17页珍藏版)》请在冰豆网上搜索。
4、功能函数设计:
找出每一列的所有项
首先找规律,如下所示
进行乘法:
a[0]a[1]a[2]
b[0]b[1]b[2]
b[2]a[0] b[2]a[1] b[2]a[2]
b[1]a[0] b[1]a[1] b[1]a[2]
b[0]a[0] b[0]a[1] b[0]a[2]
下标之和 0 1234
i=4i=3i=2i=1i=0(循环时的i的数值)
即有
下标之和=m+n-2-i,由此限定条件可设计循环得出每一列的所有项。
故首先解决了找出每一列所有项的问题。
计算从低位到高位每一位的值。
显然考虑到进位的问题,故必须从低位到高位依次计算,对于每一列,第一项可以除十取余数,保留在原位,存入c[],所得商进位存入mm。
然后对于第二列,第一项加进位mm,然后取余数存入su,再加第二项,取余数存入c[],求商存入进位mm,直到该列所有项参与运算到该列结束时,求的最终的c[],和mm.依次进行后面的运算。
找出反向存入结果c[]中的首项.
因为最高位一定不为零,故可以设计程序从c[399]开始判断,当c[i]不等于零时,即为最高项。
设计主函数,依次调用如上函数。
然后通过for循环
5、程序代码:
#include<
stdio.h>
math.h>
voidsum(inta[200],intb[200],intm,intn)//结果在数组里顺序是反着的
{
intmm=0;
//保存进位
intc[400]={0};
//保存结果
inti,j,su,tt;
for(i=0;
i<
m+n;
i++)
{
su=0;
for(j=0;
j<
m;
j++)
{
if((tt=(m-1+n-1-i-j))>
=n||(tt=(m-1+n-1-i-j))<
0)
continue;
else
su=su+a[j]*b[m-1+n-1-i-j];
}
su=su+mm;
c[i]=su%10;
mm=su/10;
}
printf("
\n***************************\n"
);
结果是:
\n"
for(i=399;
i>
=0;
i--)//找首位
{
if(c[i]!
=0)
tt=i;
break;
elsecontinue;
}
for(i=tt;
i--)//输出
printf("
%d"
c[i]);
printf("
}
voidmain()
{
inti,m,n,c;
inta[200]={0},b[200]={0};
***************************\n"
请输入第一个数字:
(c=getchar())!
='
\n'
;
a[i]=c-48;
m=i;
请输入第二个数字:
b[i]=c-48;
n=i;
//m,n为数字长度
sum(a,b,m,n);
6运行与测试:
7、设计心得:
根据数字相乘原理,编程实现了大数相乘,虽然过程中出现了许多问题但经过与同学讨论后都顺利解决。
二、多项式相乘
能够按照指数降序排列建立多项式,能够完成两个多项式的相乘,并将结果输出。
这个程序的关键是多项式的创建和排列,以及相乘时相同指数的系数相加。
由于多项式拥有指数和系数(假设基数已定),所以可以定义一个包含指数系数的结构体,用单链表存储多项式的数据,所以结构体包含next指针。
数据插入时比较两数的指数,按照降序排序,从表头的next开始,直至找到合适的位置,然后开始链表中数值的插入,如果相等则直接将指数相加,如果大于就将新数据插入到当前指向的前面,否则将新数据插入到最后。
输入完数据后相乘,多项式运算时要循环遍历整个多项式,多项式的每一组数据都要和另一个多项式整组数据相乘,直到两个多项式都遍历完结束。
对已排序且合并了同指数项的两个多项式实现乘法操作,并输出结果;
结果多项式要求以动态链表为存储结构,复用原多项式的结点空间;
输出结果多项式要求按指数升序排列,同指数的多项要合并,项数的正负号要求显示合理。
4、功能函数设计(见源代码)
5、程序代码:
stdlib.h>
#defineTRUE1
#defineFALSE0
#defineNsizeof(structquantic)
//跳转页面
voidwelcome()
\n*******************************\n"
//创建多项式结构体
structquantic
intxishu;
intmi;
structquantic*next;
};
//得到一元变量
chargetx(void)
charx;
\n请输入一元变量:
"
scanf("
%c"
&
x);
returnx;
//创建多项式链表
structquantic*input(void)
structquantic*p1,*p2,*head;
head=p2=(structquantic*)malloc(N);
\n请输入:
系数幂值(系数输入0结束)。
p1=(structquantic*)malloc(N);
%d%d"
p1->
xishu,&
mi);
while(p1->
xishu!
=0)
{
p2->
next=p1;
p2=p1;
p1=(structquantic*)malloc(N);
scanf("
p2->
next=NULL;
free(p1);
returnhead;
//查找
voidfind(charx,structquantic*p)
structquantic*p1;
intm,n,i=0;
p1=p;
1.按系数查找。
2.按指数查找。
0.退出查找。
m);
switch(m)
case1:
printf("
请输入索引关键字:
scanf("
n);
p1=p1->
next;
while(p1!
=NULL)
{
if(p1->
xishu==n)
{
printf("
%d%c(%d) "
p1->
xishu,x,p1->
i++;
}
p1=p1->
next;
}
if(i==0)
printf("
查无此数据。
find(x,p);
break;
case2:
mi==n)
case0:
welcome();
//多项式相乘
structquantic*MulExp(structquantic**exp1,structquantic**exp2)
structquantic*head,*p1,*q,*p2,*last,pre,*p;
intflag=TRUE;
head=p1=*exp1;
// p1=p1->
for(;
p1->
next!
=NULL;
p1=p1->
next);
p=last=p1;
p1=(*exp1)->
while(p1!
=p->
next)
pre=*p1;
flag=TRUE;
p2=(*exp2)->
while(p2)
if(flag==TRUE)
p1->
xishu=p1->
xishu*p2->
xishu;
mi=p1->
mi+p2->
mi;
p2=p2->
nex
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 大数 相乘 多项式