长整数代数运算

1.1、 设计任务与目标

1.1、1. 任务描述

长整数代数运算:
应用线性数据结构解决长整数的计算问题。设计数据结构完成长整数的表示和存储,并编写算法来实现两长整数的加、减、乘、除等基本代数运算。

1.1、2. 具体目标
(1) 长整数长度在一百位以上。
(2) 实现两长整数的加、减、乘、除操作。
(3) 输入输出均在文件中。
(4) 分析算法的时空复杂性。
1.1、3. 目的意义

在一般的程序运算中,长整数是无法计算的,因为计算机一次能够运算的位数是有限,一旦整数很长,就需要一个程序来进行多次计算,通过这个程序,可一把一个长整数分成多个普通整数来进行计算,使得长整数也可以进行运算。

1.2、 数据结构和算法说明

1.2.1 总体分析设计

要设计一个实现长整数进行四则运算的程序,长整数长度在一百位以上,有正负数的区别。输入长整数,位数没有上限,以回车结束长整型数据的输入。用Node结点数据结构存储数据。每一个数据有一个头结点,它的data域用来放数据的正负数。其余结点的数都为正整数。程序包含数据的输入,判断,运算,输出和主函数。在输入数据时总是从高位到低位(从左到右)地存储,而计算时总是从低位向高位(从右到左)运算,采用双向链表更方便,而为了从头结点方便地转到尾结点可以采用循环链表,所以选择用双向链表。包含两个文件,一个base.h头文件保存所有的具体方法,main.pp文件是保存主函数。

1.2.2 详细分析

加法的实现需要声明一个移位carry,从右到左运算,当第一个数的对应节点数据加上第二个数对应节点数据大于10,则移位carry加一,对两数的和求余再存储,下一对对应数(从右往左)相加的时候需要加上carry的值再作加法运算(满10进1)。
减法需要设置一个借位borrow,当第一个数的对应节点数据减去第二个数对应节点数据小于0,则borrow加一,减数加上10,做差保存两数差值,下一对对应数(从右往左)相减的时候减数需要减去borrow值先再作减法运算。
乘法模拟手写乘法的运算,需要设置一个进位,两个循环(一个while循环里面嵌套一个while循环),第一个数A从最右边的那个数c开始,对第二个数b的从左往右每一个进行相乘,相乘大于10,则求余保存后再进行除10运算得进位,当A与B下一个数字相乘的时候,先进行乘法运算再加上进位值,则求余保存后再进行除10运算得进位,以此类推,直到A的最右边的数c运算完成之后,A的值往左移动,这时A对应的数字d再与B的每个数相乘,所得的乘积要比B与c相乘的大10倍,也就是保存的值错开一位数字。
除法运算实际就是减法运算,设置商值为count,用第一个数A减去第二个数B,当A大于B时,A=A-B,count++;直到A小于B的时候,结束运算,输出count的值与A的值(此时A是余数)。

1.2.3 流程图

在这里插入图片描述

1.2.4 遇到问题

(1)指针与引用使用不熟练,出现了多次指针判空或者野指针,无法实现功能。后来查看大量书籍和网页,最终发现问题,成功解决问题。
(2)选择数据结构的时候,最先选择了单链表,做了很多无用功,参考了网上的资料,多次撞墙后,最终才选择了双链循环链表。
(3)关于节点保存几位数字我做了很多次实验,一开始是保存10位数字,出现了long类型也无法保存两个数的乘积的情况。然后测试5位数的时候,发现了一个很严重的问题:虽然保存5位数一个节点能够有效的节省内存空间,但是当输入的数据不是5的整数倍的时候,会发生乘法运算错误,由于进位出错,第一次跳过的是最后一个节点的位数进位,但是前面的统一是跳过5位,运算失败。而且,当一个节点保存了多位数据的时候,当有一个节点里面全是0的时候,比如是5个数字一个节点的,我想运算100000000000000000001与100000000000002的值,中间会有多个0,而节点只会保存了一个0,导致输入保存数据的时候发生了错误,往后的所有运算都出错。
(4)长整数的除法,由于我设计的节点都是只存一个值,每个数都是独立的,所以只能通过减法迭代来实现除法运算,这就意味着算法的效率会受影响,当两个数差距很大的时候,会出现除法运算很慢的情况。

1.3 全部源码

这里我用了C++写了非常详细的代码,功能需求都能完美实现,备注详细,欢迎大家下载学习!
代码下载链接
无须积分与C币,100%原创,点个赞支持一下好吧

1.4、程序运行、测试与分析

1.4、1. 程序测试

截图:
在这里插入图片描述

结论:测试成功
 长度在100位以上成功
 实现两长整数的加、减、乘、除操作
 输入输出均在文件中

  • 18
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值