超大数的四则运算

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

7
5
8
7
6
9
7
8 6
被乘数 1
初始化进位为0,各对应 位相乘后再加上进位数
1、进位为5 2、进位为6 3、进位为5
6
5
4、进位为4
0
由低位向高位相加计算,直至所有运算结束
处理中注意问题:
输出时要逆序输 出,因为链表首 指针是存的结果 的最低位。函数 为了对应输入输 出结果的一致性 ,都有采用了字 符串输出,所以 在输出时又将链 表转为了字符串
1
传入和保存的都是字 符,所以计算时要将 字符转化为数字,算 完再转化为字符存储 另外进位时要处理, 当前的值加上进位的 值再看本位数字是否 又有进位;
3
2
除法运算的实现
首先说一下我们所要的结果,当除数除 不开被子除数时,不用除到小数,当除 数小于被除数时,除数作为余数既可, 不用再向下除了。
除法运算的实现 除法算法最容易想到的数字电路,或模拟电 路时里面有用门实现的除法器,做法是用除 数减被除数,再用一个加法器去计算存储结 果,算法简单明了,计算速度比算乘方时还 慢,电路中计算的长度不过8位,16位,32 位,而Βιβλιοθήκη Baidu都是硬件实现,现要算的是几千位, 几万位。特别是两数位长度差很大时计算速 度相当慢,如10000-3时要进行多少次链表 运算啊。
1
2
结果可能会出现前面是 一堆0的情况,要处理好 ,如当减数为112,而被 减数为111时,会出现 001
乘法运算的实现 首先说一下乘法计算的算法,从低位向高 位乘,在竖式计算中,我们是将乘数第一 位与被乘数的每一位相乘,记录结果,之 后,用第二位相乘,记录结果并且左移一 位,以此类推,直到计算完最后一位,再 将各项结果相加。得出最后结果。当然我 们可以直接用这种方法,但要用多个链表 来保存计算出的分结果, 之后结果再相加 得到最后结果,但是这样会浪费很多空间。
减法运算的实现
算法也是从低位开始减。先要判断减数和被减 数那一个位数长,减数位数长是正常减;被减 数位数长,则被减数减减数,最后还要加上负 号;两数位数长度相等时,最好比那一个数字 大,否则负号处理会很繁琐;处理每一项时要, 如果前一位相减有借位,就先减去上一位的借 位,无则不减,再去判断是否能够减开被减数, 如果减不开,就要借位后再去减,同时臵借位 为1,否则臵借位为0。
超大数的四则运算
请计算: 1、 2 的 1000次幂 2、 2 的 10000次幂 3、 1234567890123456789123456789034 53434534534535345434543 乘上 9387429387492873492873402803482 0938479288374892733453453534
数字存储的实现 struct Node // 定义一个双向链表用来存贮结果 { char data; // 数据*定义为字符的原因:要显示负号 Node *next; // 尾指针 Node *ahead; // 首指针 };
加法运算的实现
+
加数
1
2
2
3
3
4
4
5
3
6
4
7
4
8
6
9
1
2
幂运算的实现
幂的实现是最为简单的了,国为有了前面 的算法做铺垫,就是调用乘法函数,来循 环去自乘,幂指数相应减1,直到幂指数变 为0时结束。
减法运算的实现
-
减数
1
2
2
3
3
4
4
5
3
6
4
7
5
8
7
6
9
7
8 9
被减数 1
初始化借位为0,各对应 位相减后再减上借位数
1、借位为1 2、借位为1 3、借位为0
6
0
4、借位为0
2
由低位向高位相加计算,直至所有运算结束
处理中注意问题:
如果被减数大于减数时 ,指针和相应循环长度 控制变量也要做相应的 修改
主要内容
1
2 3 4 5 6
数字存储的实现 加法运算的实现
减法运算的实现
乘法运算的实现 除法运算的实现
幂运算的实现
数字存储的实现 大数计算的因数和结果精度一般是少则数 十位,多则几万位。在C/C++语言中定义 的类型中精度最多只有二十多位,因而我 们采取用链表存贮的方式来存放大数。在 计算中会用到从高位开始计算,和从低位 开始计算数值的两种情况。所以我们将链 表定义为双向链表,其中为一个单元来存 贮数据,一个指针指向前方的数据,另一 个指向后的数据。其结构为:
乘法运算的实现
只用一个链表来表示结果,先把第一位乘数 与被乘数的结果保存在链表中,之后把存储 结果的头部后移一位、也就是从链表的第二 加起,当第二位乘数与被乘数结果加到第二 之后的各个项内。以此类推,直到结束。这 样就可以用一个链表来存储相乘后的结果。
乘法运算的实现
*
乘数
1
2
2
3
3
4
4
5
3
6
4
除法运算的实现
就是从高位向低位减,减时以被除数长度为单 位,从高位取出大于被除数的字符串,和被除 数相减,减的次数为结果,余数从剩下的除数 高位再取出几位做补位,直到大于被除数。再 减,循环减到被减数大于余数加上补位,那么 这个新的余数作为结果返回。
处理中注意问题:
除法算法计算时是用的 最高位开始向低位减, 所以要注意指针的位臵 。 余数和被减数相减时, 一定要注意:一旦能够 减开被除数时,一定要 每从除数那里取一个字 符时,结果也要对应补 一个0。如111222/111
6
9
1 0
被加数 1
初始化进位为0,各对应 位相加后再加上进位数
1、进位为1 2、进位为1 3、进位为1
6
5
4、进位为1
2
由低位向高位相加计算,直至所有运算结束
处理中注意问题:
必须判断出操作数A、B 的长度,以位长的一个 作为循环基础。
1
2
最后一位(最高位)的 运算中,若进位不为0, 则需增设多一个存储结 点。
相关文档
最新文档