大数乘法
WINTER
2020
问题描述
众所周知,C语言中Int类型的数值是有上限的,因此我们需要计算两个大数的乘法的时候就不能使用Int。然而,double类型即使在整数计算时也会有精度损失的问题而导致结果不太准确。那么,我们该如何实现大数之间的乘法呢?
(题目来源:20级软件工程面试真题)
方法详解
(算是我自己口胡吧)
(由于我还没有学数组,就不写代码了略略略)~~(好吧是我懒)~~
方法一:模拟竖式乘法
ZJUMSC
设置三个数组a[ ] b[ ] c[ ],其中a[ ] b[ ]分别倒着储存两个大数的数字。
例如:
123456789-->a[ 1 ] = 9 a[ 2 ] = 8······a[ 9 ] = 1
a[ 10 ] = 0 a[ 11 ]=0 ······
构建循环,以b为循环变量,循环次数为第二个大数的位数。
内部再套一个循环,用来将a[ i ]从1循环到最大位数。
然后用a[ i ] \ * b[ 1 ],由于最大的情况是9 \ * 9 + 8(这个8来自上一个的进位)= 89,也就是说只可能答案是两位数,因此很安全。
于是
c[ i+1 ]=c[ i+1 ]+a[ i ]*b[ 1 ] / 10
c[ i ]=c[ i ]+a[ i ] \ * b[ 1 ] % 10 (要注意这两句代码的顺序)
最后检查C[ ],如果发现超过10,则向后一位进位。
结果是倒序输出C数组各个下标的数。
方法二:快速傅里叶变换。
ZJUMSC
这个就违背了新手向的初衷了
因此有兴趣的小伙伴们可以自行学习
**(祝小伙伴们高数满绩)**
还有什么新的想法欢迎留言讨论哟~
扫码关注
ZJUMSC
微信号|ZJUMSC2018
供稿人:李予谦
制作人:沈骏一