大数据结构课程设计--大数相乘

合集下载

数据结构课程设计长整数四则运算

数据结构课程设计长整数四则运算

数据结构课程设计题目:长整数四则运算班级学号学生姓名提交日期成绩计算机与通信工程学院长整数四则运算一需求分析:问题描述:设计一个实现任意长的整数进行加法运算的演示程序。

基本要求:利用双向循环链表实现长整数的存储,每个结点含一个整形变量。

任何整形变量的范围是 -(2^15 - 1) (2^15 - 1)。

输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。

在现实生活中有很多地方,例如航空航海、生物医疗等等方面,都需要很大的数来表示,这些用int甚至长整型long long都是远不够的,所以需要有一种算法来解决这种大数的表示和运算。

该问题只要求了大数的相加运算。

二详细设计:大致思路:【存储】用两个链表,每个节点保存一位数,在链表头保存数的正负,正数保存1,负数保存-1,如果是正数,后面每一位都储存正数,负数每一位都储存负数,数字按照链表头到链表尾从高位到低位的顺序;【相加】从两个链表的尾部开始同步向前相加,加完存到第一个链表,第二个加完的结点销毁,会存在两个链表不一样长的情况,没加的直接连到链表的前面,最高位的符号存到链表的头;【调整】根据表头的符号,调整后面的数字的值,中间会产生进位或者退位的问题,各个节点的符号不一定相同,但对于正负数都可以建立同样的调整模式,将正负到tmp中(1或-1)加或者减(tmp*10),然后对前一位加或者减tmp*1即可。

第一位保留符号不变,这样不用处理多余的进位,也就不用再产生新的节点,也不用保存符号。

【输出】从前到后遍历已经处理好的表,将每一位进行输出就可以了。

结构体定义struct Node{Node *pre;Node *next;int data;};功能函数void Input(Node *p,Node *t)//处理输入和保存void disply(Node *h,Node *t,int l)//输出void add(Node *h1,Node *t1,Node *h2,Node *t2)//每一位相加int adjust(Node *h,Node *t)//将各个位的正负、大小、进位进行调整源程序:。

大数加减运算

大数加减运算

NANCHANG UNIVERSITY课程设计报告课程名称:计算机技术综合课程设计题目:大数的加减运算学院:信息工程学院系:计算机科学与技术系专业:网络工程班级: 1 3 1 班学号:610321301?学生姓名:张时间:2016.8.29~2016.9.8摘要 (1)引言 (2)问题描述 (2)第一章分析与设计 (2)第二章各个模块的实现方法描述 (3)1、显示与输入模块 (3)2、大数加减运算模块 (3)2.1 无符号加法运算的实现——PLUS方法 (4)2.2 无符号减法运算的实现——MINUS方法 (4)2.3 有符号加减运算的实现——add方法和sub方法 (6)第三章运行结果效果图 (8)第四章实验总结 (10)第五章附录:程序源代码 (11)1.输入与显示模块:UI类 (11)2. 大数运算模块:GetResult类 (15)第六章参考文献 (21)在数学中,数值的大小是没有上限的,但是在计算机中,由于字长的限制,计算机所能表示的范围是有限的,当我们对比较小的数进行运算时,如:1234+5678,这样的数值并没有超出计算机的表示范围,所以可以运算。

但是当我们在实际的应用中进行大量的数据处理时,会发现参与运算的数往往超过计算机的基本数据类型的表示范围,这就涉到大数运算。

大数运算,顾名思义,就是很大的数值的数进行一系列的运算。

本文采用一个在JAVA语言下实现大数运算的一个程序为例,讲解包括了大数的加法,减法的算法及代码。

关键字:大数、运算精度、大数加减引言大数运算,意味着参加的值和计算结果通常是以上百位数,上千位数以及更大长度之间的整数运算。

大数运算在当代社会得到了广泛运用。

大数运算不仅仅运用在密码学中,保护网络信息安全,还在物理学、天文学、化学等学科的科研活动中发挥重要作用。

例如大家所熟知圆周率π的值,在一般的数值计算中用到圆周率的不须要多大的精度,但在天文学计算一些星球或是星系上的体积面积时便显的误差很大了,这时π值计算的精度应该达到几百万位甚至更高,才能缩小误差,这就涉及到大数运算。

算法之大整数乘法

算法之大整数乘法

大整数乘法通常,在分析一个算法的计算复杂性时,都将加法和乘法运算当作是基本运算来处理,即将执行一次加法或乘法运算所需的计算时间当作一个仅取决于计算机硬件处理速度的常数。

这个假定仅在计算机硬件能对参加运算的整数直接表示和处理时才是合理的。

然而大整数的算术运算。

请设计一个有效的算法,可以进行两个n位大整数的乘法运算。

大整数的乘法问题描述参考解答设X和Y都是n位的二进制整数,现在要计算它们的乘积XY。

我们可以用小学所学的方法来设计一个计算乘积XY的算法,但是这样做计算步骤太多,显得效率较低。

如果将每2个1位数的乘法或加法看作一步运算,那么这种方法要作O(n2)步运算才能求出乘积XY。

下面我们用分治法来设计一个更有效的大整数乘积算法。

图6-3 大整数X和Y的分段我们将n位的二进制整数X和Y各分为2段,每段的长为n/2位(为简单起见,假设n 是2的幂),如图6-3所示。

由此,X=A2n/2+B ,Y=C2n/2+D。

这样,X和Y的乘积为:XY=(A2n/2+B)(C2n/2+D)=AC2n+(AD+CB)2n/2+BD (1)如果按式(1)计算XY,则我们必须进行4次n/2位整数的乘法(AC,AD,BC和BD),以及3次不超过n位的整数加法(分别对应于式(1)中的加号),此外还要做2次移位(分别对应于式(1)中乘2n和乘2n/2)。

所有这些加法和移位共用O(n)步运算。

设T(n)是2个n位整数相乘所需的运算总数,则由式(1),我们有:(2)由此可得T(n)=O(n2)。

因此,用(1)式来计算X和Y的乘积并不比小学生的方法更有效。

要想改进算法的计算复杂性,必须减少乘法次数。

为此我们把XY写成另一种形式:XY=AC2n+[(A-B)(D-C)+AC+BD]2n/2+BD (3)虽然,式(3)看起来比式(1)复杂些,但它仅需做3次n/2位整数的乘法(AC,BD和(A-B)(D-C)),6次加、减法和2次移位。

由此可得:(4)用解递归方程的套用公式法马上可得其解为T(n)=O(n log3)=O(n1.59)。

大整数乘法

大整数乘法

大整数乘法问题描述通常,在分析一个算法的计算复杂性时,都将加法和乘法运算当作是基本运算来处理,即将执行一次加法或乘法运算所需的计算时间当作一个仅取决于计算机硬件处理速度的常数。

这个假定仅在计算机硬件能对参加运算的整数直接表示和处理时才是合理的。

然而,在某些情况下,我们要处理很大的整数,它无法在计算机硬件能直接表示的范围内进行处理。

若用浮点数来表示它,则只能近似地表示它的大小,计算结果中的有效数字也受到限制。

若要精确地表示大整数并在计算结果中要求精确地得到所有位数上的数字,就必须用软件的方法来实现大整数的算术运算。

请设计一个有效的算法,可以进行两个n位大整数的乘法运算。

参考解答大整数的乘法问题描述参考解答设X和Y都是n位的二进制整数,现在要计算它们的乘积XY。

我们可以用小学所学的方法来设计一个计算乘积XY的算法,但是这样做计算步骤太多,显得效率较低。

如果将每2个1位数的乘法或加法看作一步运算,那么这种方法要作O(n2)步运算才能求出乘积XY。

下面我们用分治法来设计一个更有效的大整数乘积算法。

图6-3 大整数X和Y的分段我们将n位的二进制整数X和Y各分为2段,每段的长为n/2位(为简单起见,假设n是2的幂),如图6-3所示。

由此,X=A2n/2+B ,Y=C2n/2+D。

这样,X和Y的乘积为:XY=(A2n/2+B)(C2n/2+D)=AC2n+(AD+CB)2n/2+BD (1)如果按式(1)计算XY,则我们必须进行4次n/2位整数的乘法(AC,AD,BC和BD),以及3次不超过n位的整数加法(分别对应于式(1)中的加号),此外还要做2次移位(分别对应于式(1)中乘2n和乘2n/2)。

所有这些加法和移位共用O(n)步运算。

设T(n)是2个n位整数相乘所需的运算总数,则由式(1),我们有:(2)由此可得T(n)=O(n2)。

因此,用(1)式来计算X和Y的乘积并不比小学生的方法更有效。

要想改进算法的计算复杂性,必须减少乘法次数。

大数乘法算法

大数乘法算法

大数乘法算法引言在计算机科学领域的算法中,大数乘法是一个经典且重要的问题。

它涉及到将两个较大的数相乘,可能超出常规数据类型的表示范围。

因此,需要设计一种高效的算法来处理这个问题。

本文将深入探讨大数乘法算法及其相关概念。

传统乘法算法传统的乘法算法是我们从小学时就学习的算法。

它将两个数的每一位相乘,然后将乘积逐位相加。

以下是一个简单的例子:123× 45-----615 (5 × 123)492 (4 × 123,向左移一位,相当于乘以10)-----5535 (615 + 492)我们可以看到,传统乘法算法需要逐位相乘,并进行进位操作。

对于较大的数,这种算法会变得非常耗时。

大数乘法算法大数乘法算法是专门用来解决大数相乘问题的算法。

下面将介绍两种常见的大数乘法算法:分治法和Karatsuba算法。

分治法分治法是一种将问题分解成子问题并分别解决的算法。

对于大数乘法,可以将两个数分成两半,然后将每个子问题的解相加得到最终的结果。

以下是分治法的步骤:1.将两个数分别拆分成两个子数。

例如,将123和45分别拆分成12、3和4,5。

2.对每个子问题递归地应用大数乘法算法。

例如,计算12 × 4、3 × 5。

3.将每个子问题的结果相加。

例如,计算12 × 4 + 3 × 5。

4.合并子问题的结果并返回最终的乘积。

使用分治法可以显著减少计算量,因为子问题的规模较小。

然而,分治法仍然需要进行递归操作,因此对于非常大的数,仍然存在一定的效率问题。

Karatsuba算法Karatsuba算法是一种改进的大数乘法算法,它比传统的乘法算法更高效。

Karatsuba算法的核心思想是利用数的二进制表示将乘法问题转化为更小的子问题。

以下是Karatsuba算法的步骤:1.将两个数用二进制表示,并找到二进制表示中位数相同的位置。

例如,对于10和11(二进制表示为1010和1011),找到相同的中位数为第2位。

大数的乘法与除法

大数的乘法与除法

大数的乘法与除法大数的乘法和除法是在数学运算中经常遇到的问题,尤其是在计算机科学和数据处理领域。

本文将探讨大数乘法和除法的基本原理,并介绍一些常用的算法和技巧。

一、大数乘法大数乘法是指对超过计算机字长的整数进行乘法运算。

当乘数或被乘数超过计算机的位数限制时,传统的乘法算法将无法执行。

这就需要采用特殊的算法来解决这个问题。

1.1 基本的大数乘法算法最简单直观的大数乘法算法是模拟手工乘法的过程,将乘法转化为逐位相乘和进位相加的问题。

具体步骤如下:1)将被乘数和乘数逐位相乘,得到一系列的乘积;2)逐位对乘积进行进位相加,得到最终的结果。

1.2 Karatsuba乘法Karatsuba乘法是一种改进的大数乘法算法,它可以将乘法问题分解成更小的子问题,并利用递归来解决。

其核心思想是通过减少乘法的次数来提高计算效率。

具体步骤如下:1)将被乘数和乘数分别拆分成高位和低位两部分;2)对高位和低位进行乘法运算,得到四个乘积;3)根据乘积的特点,组合四个乘积并进行加减运算,得到最终的结果。

Karatsuba乘法算法在大数乘法中可以实现更高的运算效率,尤其是在乘数和被乘数位数相同时。

二、大数除法大数除法是指对超过计算机字长的整数进行除法运算。

当被除数或除数超过计算机位数限制时,常规的除法算法无法进行。

以下介绍两种常用的大数除法算法。

2.1 短除法短除法是最基本的除法算法,通过逐位的除法和取模运算来得到商和余数。

具体步骤如下:1)将被除数的最高位与除数进行除法运算,得到商的最高位;2)用被除数减去商的最高位与除数的乘积,得到一个新的被除数;3)重复第一步和第二步,直到被除数不足以进行下一次运算;4)最后得到的各位商组合在一起即为最终的商,最后一次减法所得的值即为余数。

2.2 Newton-Raphson除法Newton-Raphson除法是一种迭代的除法算法,通过不断逼近真实的商的值来得到精确的商和余数。

其核心思想是使用牛顿迭代法来解方程。

线性表的应用(算法与数据结构课程设计)

线性表的应用(算法与数据结构课程设计)

线性表的应用一、问题描述线性表有两种不同的存储结构,分别是顺序存储结构和链式存储结构,在实际中应用十分广泛。

本设计要求分别利用线性表的两种存储结构,设计算法完成对大数的阶乘、加法、乘法的求解。

二、基本要求1、选择合适的存储结构实现大数存储;2、设计算法,采用顺序存储结构完成大数的阶乘运算;3、设计算法,采用链式存储结构完成大数的加法运算;4、设计算法,选择合适的存储结构完成大数的乘法运算;5、其中某一算法采用两种存储结构实现。

三、测试数据1、阶乘运算的测试数据:63!2、加法运算的测试数据: 9876876787+896789675599993、乘法运算的测试数据:9876876787×89678967559999四、算法思想1、阶乘运算的算法思想:一个数的阶乘,利用一个顺序表来存储结果,首先令L.elem[0]=1,其他全部赋值为零,再用for循环,从1至i完成阶乘运算,其中由于位数越乘越多,故将其按位存储在顺序表中,防止数据范围溢出,在逐位相乘中,利用for循环位数,如若有进位问题,每次运算时,此位保留的数位,t=L.elem[j]*i+jw; L.elem[j]=t%10;jw=t/10;如果满足j>=top && jw==0;程序跳出,进行下一步i运算,此处top位保留上一位的位数,如此运算下去,输出顺序表。

2、加法运算的算法思想:本运算分别采用了两种存储结构,链式和栈存储结构。

加法是两个数位数对齐,从低位向高位加的运算,如果在哪位有进位,则后一位,进行加法还要另加上前面的进位,由此将输入的字符大数,存入链表中,且改为整形存入,此时是的链表是倒序的,定义一个变量表示每次的进位jw=0,建立一个链表,让他存储结果,如此两链表的数相加,每次还要加上上次留下的进位,此为保留的数位:new->data =(p->data +q->data +jw)%10; new->next =NULL;jw =(p->data+q->data+jw)/10;当两个数是一场一短时,自然当相等的长度加完后在执行下面的判断,保留住剩下的数同时每次加上jw,最后就是当最后一位有进位时将最后一个链表值赋jw,由于现在此链表存储的结果是反序的,故将其压入栈中,让后再输出栈元素,就是想加的结果。

任意长整数的乘法数据结构课程设计报告样本

任意长整数的乘法数据结构课程设计报告样本

课程设计说明书 NO.1任意长整数的乘法1、课程设计目的( 1) 较熟练地掌握数据结构( C语言) 课程的基本内容, 程序设计的基本方法与编程技巧。

( 2) 较熟练地掌握C语言程序编辑、编译、连接和运行的方法。

( 3) 经过运行C程序, 了解C语言的特点, 培养学生应用计算机解决和处理实际问题的思维方法与基本能力。

2、课程设计方案论证2.1 设计思路( 1) 输入的形式和输入值的范围:用户从键盘输入2个任意长度的长整数, 输入的时候是按4个为一段输入的, 即一段一段输入的, 求它们的乘积的大小, 并将结果在屏幕上显示; 2个长整数的输入没有大小的限制, 要输入多大的数据,就能够输入多大的数据。

( 2) 输出的形式:输出直接在屏幕上显示2个任意长度的长整数的乘积大小。

( 3) 程序所能达到的功能:对于用户输入的任意长度的2个的长整数, 能够正确没有错误的显示结果, 和电脑附件中的计算器的计算值要一致; 能够准确无误地显示结果。

( 4) 测试数据:如输入1000 1000 和1111 2个长整数后, 显示0111 1111 1111 1000的话, 就是正确的结果形式。

如输入1111 1111 1111和1111 2个长整数后, 结果显示0123 4444 4444 4322就不是正确结果, 因为这2个长整数的积为0123 4444 4444 43212.2概要设计( 1) 抽象数据类型的定义为了实现任意长整数的乘法, 因为这种运算存在进位和位移等操作, 因此选择双链表的结构体( 如图2.2.1和图2.2.2) , 它有一个data, left, right; 考虑到data表示的数据的范围, 使它只接受4个数字的整数, 这样一个长整数就分为若干段, 每一段为4个数沈阳大学课程设计说明书 NO2字, 便于进位和借位以及位移的操作, 用户在输入时就是每次输入4个数字。

( 2) 主程序的流程主程序是首先调用初始化2个长整数的函数, 用户4个数字一段一段地输入2个长整数, 用双链表的形式和头插法的形式建立, 返回2个长整数的头节点; 建立完2个长整数后,就开始进行2个长整数的乘积的运算了;首先将第一个长整数的全部去乘第2个长整数的最后一段, 这样得到一个长整数; 接着将第一个长整数的全部去乘第2个长整数的倒数第2段; 这样得到一个长整数, 可是要向左位移4位; 这次得到的长整数要和上一次相加, 得到一个新的长整数; 接着接着将第一个长整数的全部去乘第2个长整数的倒数第3段, 得到一个长整数, 再和前面相加;依次进行, 一直到已经到第一个长整数的全部乘于了第2个长整数的最高1段, 那么乘法就结束了; 这时将得到的长整数从高位到低位一段一段, 4个4个数字显示在屏幕上, 程序就运行结束了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计报告学号::王建春班级:信息一班教师:容:大数相乘日期:2014年6月30日课题名称:大数相乘1.问题描述计算机的存有限,而且各个函数类型的围有限,如果要计算两个更大的乘数,就会超出围,得到不精确的数,如何得到更精确的数,而又不受计算机存空间的限制,本程序就可以解决大数相乘的问题。

2.设计思路这个程序的关键是如何保存大数的各个数字,以及如何处理大数乘法的进位问题。

本人是运用栈的思想做的,先定义一个整型的栈,大数传入栈的整型数组中,在乘法运算函数中,先从一个栈中取出一个大数S1的个位上的数字a,再从另一个大数S2取出一个个位数字b,再将a*b+d(d为进位数)的个位数字压到栈S中,十位上进位的数字先保存到d中,再从S2中取出一个十位数,与a相乘,得到的个位数字再压到栈S中,再从S2中取出一个数字,以此类推,直到S2中的数字被a乘完,得到一个新的大数S,将该栈保存到A栈中,将S 销毁,再从S1中取出大数的十位数字,与S2的各个数字相乘,得到一个新的大数压到S中,将S保存到B中,将B移位处理后,然后与A相加得到另一个大数,以此类推,最终可相加得到想要的结果。

这其中还用到了大数相加的原理。

3.数据结构设计前面提到,要用到栈的操作,这里,由于一个大数的最大长度是一定的,且大数最多执行的操作是插入和删除操作,所以顺序存储结构可以带来更大益处。

为了便于大数相加,将大数的各个数字存入到整型数组中。

#define MAXSIZE 1500typedef struct node{int data[MAXSIZE];int top;}SeqStack,*PSeqStack;4.功能函数设计(1)栈初始化函数Init_SeqStack(char *ch)此函数是将传入的字符处理成0~9的整数存入整型数组中。

将*ch-’0’转化为整数存入S->data[i]中,结束标志是*ch不等于’\0’(2)首尾倒置函数Convert_SeqStack(PSeqStack A)此函数是将栈中的数值首尾颠倒,比如以前是1234,现在变成4321。

只要将传入的A的栈中的元素依次取出压到C中,再返回C栈即可(3)大数相加函数Add(PSeqStack S1,PSeqStack S2)此函数是处理两个大数相加的功能。

将传入的两个大数压到S1和S2中,当S1或S2不为空时,从S1中取出a,从S2中取出b,得到Result=(a+b)%10+d,其中初始时d=0,再判断Result是否大于10,如果小于10直接压到栈S中,如果大于10将Result%10压入栈中,令d=(a+b)/10+Result/10;如果运算后其中的一个栈空了,另一个不空的栈的数值加上进位数d再直接压到S中,这样可以得到一个大数。

(4)移位函数Crol(PSeqStack S,int n)将其中一位大数取出一位数字与另一位大数相乘的结果移位,然后相加,从各位开始,每乘一个数,都要移位一个0(5)复制函数Copy_SeqStack(PSeqStack A,PSeqStack B)将一个A栈中的元素拷贝到B栈中,先将A中的元素压到C栈中,再将C栈中的元素压到B栈中,即可实现复制功能(6)大数相乘函数Multiply(PSeqStack S1,PSeqStack S2)此函数是实现大数相乘的核心算法。

主要思想就是将S1中取出个位数a,分别与S2中的各个数相乘得到新的大数,再取S1中的十位数,与S1大数相乘,以此类推,然后将各个大数进行移位处理再相加5.编码实现#include "stdlib.h"#include "stdio.h"#include "string.h"#define MAXSIZE 1500typedef struct node{int data[MAXSIZE];int top;}SeqStack,*PSeqStack;void Destroy_SeqStack(PSeqStack *S){if(*S)free(*S);*S=NULL;return;}int Push_SeqStack(PSeqStack S,int x) {if(S->top==MAXSIZE-1)return 0;else{S->top++;S->data[S->top]=x;return 1;}}PSeqStack Init_SeqStack(char *ch) {PSeqStack S;int i=0;char *head;S=(PSeqStack)malloc(sizeof(SeqStack));if(S)S->top=-1;head=ch;while(*ch!='\0'){if(*head=='-')S->data[i]=(*(++ch)-'0')*(-1);elseS->data[i]=*ch-'0';ch++;S->top++;i++;}return S;}int GetTop_SeqStack(PSeqStack S,int *x) {if(S->top==-1)return 0;else{*x=S->data[S->top];return 1;}}int Empty_SeqStack(PSeqStack S){if(S->top==-1)return 1;elsereturn 0;}int Pop_SeqStack(PSeqStack S,int *x) {if(Empty_SeqStack(S))return 0;else{*x=S->data[S->top];S->top--;return 1;}}void print(PSeqStack S){int i;for(i=0;i<=S->top;i++)printf("%d",S->data[i]);}//将栈顶变成栈尾,栈尾变成栈顶PSeqStack Convert_SeqStack(PSeqStack A) {int x;PSeqStack C;C=(PSeqStack)malloc(sizeof(SeqStack));if(C)C->top=-1;while(!Empty_SeqStack(A)){Pop_SeqStack(A,&x);Push_SeqStack(C,x);}return C;}PSeqStack Add(PSeqStack S1,PSeqStack S2){PSeqStack S;int d=0,a,b,Result;S=(PSeqStack)malloc(sizeof(SeqStack));if(S)S->top=-1;while(!Empty_SeqStack(S1)&&!Empty_SeqStack(S2)) {Pop_SeqStack(S1,&a);Pop_SeqStack(S2,&b);Result=(a+b)%10+d;//判断Result是否大于等于10if(Result/10==0){Push_SeqStack(S,Result);d=(a+b)/10;}else if(Result/10>0){Push_SeqStack(S,Result%10);d=(a+b)/10+Result/10;}}while(!Empty_SeqStack(S1)){Pop_SeqStack(S1,&a);Result=a%10+d;if(Result/10==0){Push_SeqStack(S,Result);d=a/10;}else{Push_SeqStack(S,Result%10);d=a/10+Result/10;}}while(!Empty_SeqStack(S2)){Pop_SeqStack(S2,&a);Result=a%10+d;if(Result/10==0){Push_SeqStack(S,Result);d=a/10;}else{Push_SeqStack(S,Result%10);d=a/10+Result/10;}}if(d!=0)Push_SeqStack(S,1);S=Convert_SeqStack(S);return S;}PSeqStack Crol(PSeqStack S,int n){int i;for(i=0;i<n;i++)Push_SeqStack(S,0);return S;}void Copy_SeqStack(PSeqStack A,PSeqStack B) {PSeqStack C;int x;C=(PSeqStack)malloc(sizeof(SeqStack));if(C)C->top=-1;while(!Empty_SeqStack(A)){Pop_SeqStack(A,&x);Push_SeqStack(C,x);}while(!Empty_SeqStack(B)){Pop_SeqStack(B,&x);}while(!Empty_SeqStack(C)){Pop_SeqStack(C,&x);Push_SeqStack(A,x);Push_SeqStack(B,x);}}PSeqStack Multiply(PSeqStack S1,PSeqStack S2) {PSeqStack S,A,B;int a,b,c,d=0,Result,i,count=0;S=(PSeqStack)malloc(sizeof(SeqStack));if(S)S->top=-1;A=(PSeqStack)malloc(sizeof(SeqStack));if(A)A->top=-1;B=(PSeqStack)malloc(sizeof(SeqStack));if(B)B->top=-1;while(!Empty_SeqStack(S1)){Pop_SeqStack(S1,&a);d=0;for(i=S2->top;i>-1;i--){b=S2->data[i];//printf("%d,",b);Result=a*b%10+d;if(Result/10==0){Push_SeqStack(S,Result);d=a*b/10;}else if(Result/10>0){Push_SeqStack(S,Result%10);d=a*b/10+Result/10;}}if(d!=0)Push_SeqStack(S,d);//printf("\nS为:");//print(S);S=Convert_SeqStack(S);if(count==0){Copy_SeqStack(S,A);//将S栈拷贝到A栈//printf("\nA为:");//print(A);}else{B=Crol(S,count);//将B左移count位//printf("\nB为:");//print(B);A=Add(A,B);//printf("\nA为:");//print(A);}count++;Destroy_SeqStack(&S);S=(PSeqStack)malloc(sizeof(SeqStack));if(S)S->top=-1;}A=Convert_SeqStack(A);while(GetTop_SeqStack(A,&c)&&c==0)Pop_SeqStack(A,&c);if(Empty_SeqStack(A))Push_SeqStack(A,0);A=Convert_SeqStack(A);return A;}void main(){PSeqStack A,B,C;int i;//char *ch1={"29"},*ch2={"896"};//char *ch1={"99"},*ch2={"1"};//char *ch1={"1111"},*ch2={"1111"};//char *ch1={"11111111"},*ch2={"-11111111"};//char *ch1={"464"},*ch2={"0"};char ch1[MAXSIZE],ch2[MAXSIZE];printf("请输入第一个大数:");gets(ch1);printf("\n请输入第二个大数:");gets(ch2);printf("该乘式为:");A=Init_SeqStack(ch1);print(A);printf("*");B=Init_SeqStack(ch2);print(B);printf("\n");//C=Add(A,B);C=Multiply(A,B);printf("\n计算结果为:");for(i=0;i<=C->top;i++){printf("%d",C->data[i]);}// print(C);printf("\n");//printf("实际结果为:225");}6.运行与测试首先屏幕会提示你输入第一个大数,然后按回车键,屏幕会提示你输入第二个大数,再按回车键,即可得到计算结果7.设计中存在的问题及感想本程序的缺陷对负数以及小数相乘没有处理好,只能处理大的整数,这是一个遗憾。

相关文档
最新文档