数据结构大数相乘

合集下载

大数的四则运算

大数的四则运算

进位规则:当两个数的和超过10时,需要进位 进位方法:将超过10的部分加到下一位
进位示例:12+34=46,其中2+4=6,超过10,需要将6的个位加到下一位
进位注意事项:进位时,需要注意位数的变化,避免错误
减法运算的基本原理 减法运算的注意事项
位数不同时的减法方法 减法运算的应用实例
相同位数的大 数减法,首先 将两个数对齐, 从低位开始相
余数定义:在除法运算中,被除数不能被除数整除的部分
余数性质:余数小于除数
余数应用:在计算中,余数可以用来判断除法运算的结果是否正确
余数处理方法:在计算中,可以通过余数来判断是否需要进行下一次除法运算, 或者进行其他处理。
仔细阅读题目,理解题意
认真检查计算过程,避免 漏算、错算
使用计算器或计算机进行 辅助计算,提高准确性
科学计数法:用E或e表示乘以10的幂次 指数表示法:用指数表示大数的大小 符号表示法:用符号表示大数的正负 组合表示法:用组合表示大数的位数和位数之间的关系
大数是指位数较多的数,通常超过计算机能够直接表示的范围
大数的位数通常用科学计数法表示,如10^100
大数的位数可以通过计算得到,例如10^100的位数为101 大数的位数也可以根据实际情况进行估计,例如10^100的位数大约为 100
加法原理:将两个数的每一位 相加,得到新的数
进位处理:当某一位相加结果 大于10时,需要进位
结果表示:将每一位相加的结 果和进位结果组合成新的数
示例:*** + *** = ***
加法法则:相同位数相加,从低位到高位依次相加 进位处理:当低位相加结果大于等于10时,需要进位 结果表示:将进位结果加到高位,得到最终结果 示例:*** + *** = ***

大数乘法

大数乘法

BY WFSUN
注:这曾是某知名软件公司曾经频繁出现的面试题目
大数乘法、递归 2/12
常用方法
• 循环法 特点:从笔算算法中提出,思想相对简单,但位数较大时, 特点:从笔算算法中提出,思想相对简单,但位数较大时, 乘法次数多, 乘法次数多,效率较低 • 分治递归法 特点:采用分治递归思想,较常规方法复杂, 特点:采用分治递归思想,较常规方法复杂,但位数较大时 乘法次数少, ,乘法次数少,效率相对高
//先将结果数组设置 先将结果数组设置
//逐位乘法的实现 逐位乘法的实现
// 处理进位
}
BY WFSUN
大数乘法、递归
6/12
分治递归法
• 基本思想: 基本思想: 都是n位的 设X和Y都是 位的二进制(注1)整数,现在要计算它们的 和 都是 位的二进制 )整数, 乘积XY。 乘积 。 我们将n位的二进制整数 位的二进制整数X和 各分为 各分为2段 我们将 位的二进制整数 和Y各分为 段,每段的长为 n/2位(注2)SUN
大数乘法、递归
4/12
主要函数示例
/*把字符串形式的数字按位存放到数组 把字符串形式的数字按位存放到数组*/ 把字符串形式的数字按位存放到数组 void GetDigits(int *a, char *s) { int i; char digit; int len=strlen(s); for(i=0;i<N;i++) //数组初始化 数组初始化 *(a+i)=0; for(i=0;i<len;i++) //分离各位 分离各位 { digit=*(s+i); *(a+len-1-i) = digit - '0'; } }

大数的认识知识点总结

大数的认识知识点总结

大数的认识知识点总结大数是指数值较大的数,对于这类数,我们需要采取特殊的处理方法来进行计算和表示。

以下是大数的认识知识点总结。

一、大数的表示方法大数可以使用科学计数法或者使用计算机中的数据结构来表示。

1. 科学计数法:科学计数法使用一个浮点数和一个指数来表示一个大数,例如2.5×10^7表示25000000。

2. 数据结构表示:在计算机中,可以使用数组、字符串等数据结构来表示大数,每一位数字对应数组中的一个元素或者字符串中的一个字符。

二、大数的计算对于大数的计算,常见的运算包括加法、减法、乘法和除法。

下面对这些运算进行简要介绍。

1. 加法:大数的加法可以按照逐位相加的方式进行,需要注意的是进位的处理。

从低位开始相加,如果相加结果超过了进位范围,则需要进位到高位。

2. 减法:大数的减法可以按照逐位相减的方式进行,需要注意的是借位的处理。

从低位开始相减,如果被减数小于减数,则需要借位。

3. 乘法:大数的乘法可以按照逐位相乘的方式进行,同样需要注意进位的处理。

从低位开始逐位相乘,并将每一位的结果相加,得到最终的乘积。

4. 除法:大数的除法可以采用长除法的方式进行,从高位开始逐位进行计算,得到商和余数。

三、大数与溢出在计算中,大数计算可能会导致溢出问题。

溢出是指计算结果超出了计算环境的表示范围。

对于大数计算,需要考虑溢出的可能性,并采取相应的处理措施,例如使用更大的数据类型来表示结果。

四、大数应用场景大数计算广泛应用于科学计算、金融领域、密码学等领域。

例如,在密码学中,大数的计算用于生成密钥、进行加密和解密操作。

在金融领域,大数的计算用于进行精确的财务计算和风险评估。

总结:大数的认识知识点包括大数的表示方法、计算方法、溢出问题和应用场景等。

对于大数计算,我们需要采取特殊的处理方法,并注意溢出问题的出现。

在实际应用中,大数计算可以帮助我们解决一些复杂的计算问题,提高计算的精确性和准确性。

算法之大整数乘法

算法之大整数乘法

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

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

然而大整数的算术运算。

请设计一个有效的算法,可以进行两个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的乘积并不比小学生的方法更有效。

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

c语言大数处理

c语言大数处理

c语言大数处理在编程领域中,处理大数是一项常见的挑战。

在C语言中,由于整数类型的取值范围有限,当我们需要处理超过它们范围的大数时,就需要采取特殊的方法来处理。

本文将介绍几种常见的C语言大数处理方法,并附带示例代码供读者参考。

一、大数的表示方法通常情况下,C语言提供的整型数据类型的取值范围为-2^31到2^31-1,对于超过这个范围的大数,我们可以采用字符串的形式进行表示。

例如,要表示一个超过32位的大数,我们可以将该数以字符串的形式存储,每一位都分别存储在字符数组中。

二、大数的输入与输出在处理大数时,我们通常需要进行大数的输入和输出操作。

对于大数的输入,我们可以通过键盘输入或者读取外部文件的方式进行。

对于大数的输出,我们可以将大数按照需要的格式输出到屏幕上或者写入到文件中。

下面是一个使用C语言实现大数输入和输出的示例代码:```c#include <stdio.h>#include <string.h>#define MAX_SIZE 100void inputBigNumber(char* number) {printf("请输入一个大数:");scanf("%s", number);}void outputBigNumber(char* number) {printf("大数为:%s\n", number);}int main() {char number[MAX_SIZE];inputBigNumber(number);outputBigNumber(number);return 0;}```三、大数的加法大数的加法是常见的大数处理操作之一。

我们可以通过模拟手工计算的方式,从低位到高位逐位相加,并处理进位的情况。

下面是一个使用C语言实现大数加法的示例代码:```c#include <stdio.h>#include <string.h>#define MAX_SIZE 100void addBigNumber(char* num1, char* num2, char* result) {int len1 = strlen(num1);int len2 = strlen(num2);int carry = 0;int index = 0;for (int i = len1 - 1, j = len2 - 1; i >= 0 || j >= 0 || carry != 0; i--, j--) { int digit1 = i >= 0 ? num1[i] - '0' : 0;int digit2 = j >= 0 ? num2[j] - '0' : 0;int sum = digit1 + digit2 + carry;carry = sum / 10;result[index++] = sum % 10 + '0';}// 反转字符串int len = index;for (int i = 0; i < len / 2; i++) {char temp = result[i];result[i] = result[len - i - 1];result[len - i - 1] = temp;}}int main() {char num1[MAX_SIZE] = "12345678901234567890";char num2[MAX_SIZE] = "98765432109876543210";char result[MAX_SIZE];addBigNumber(num1, num2, result);printf("两个大数相加的结果为:%s\n", result);return 0;}```四、大数的乘法大数的乘法是处理大数的另一个重要操作。

大数的乘法与除法

大数的乘法与除法

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

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

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

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

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

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,由于现在此链表存储的结果是反序的,故将其压入栈中,让后再输出栈元素,就是想加的结果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18: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 100typedef 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 "stdafx.h"#include "stdlib.h"#include "stdio.h"#include "string.h"#define MAXSIZE 100typedef 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[50],ch2[50];system("color 70");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.设计中存在的问题及感想本程序的缺陷对负数以及小数相乘没有处理好,只能处理大的整数,这是一个遗憾。

相关文档
最新文档