我正在C中构建一个小的BigInt库,用于我的编程语言.
结构如下:
short digits[ 1000 ];
int len;
我有一个函数,通过将字符串拆分为单个字符并将它们放入数字,将字符串转换为bigint.
数字中的数字都是相反的,因此数字123将如下所示:
digits[0]=3 digits[1]=3 digits[2]=1
我已经设法编写了添加功能,它完美地运行.
它有点像这样:
overflow = 0
for i ++ until length of both numbers exceeded:
add numberA[ i ] to numberB[ i ]
add overflow to the result
set overflow to 0
if the result is bigger than 10:
substract 10 from the result
overflow = 1
put the result into numberReturn[ i ]
(在这种情况下溢出就是当我添加1到9时会发生什么:从10中减去10,向溢出添加1,将溢出添加到下一个数字)
那么想想如何存储两个数字,如下:
0 | 1 | 2
---------
A 2 - -
B 0 0 1
以上代表bigints 2(A)和100(B)的数字.
– 表示未初始化的数字,不访问它们.
所以添加上面的数字工作正常:从0开始,添加2 0,转到1,添加0,转到2,添加1
但:
当我想与上述结构进行乘法运算时,我的程序最终会执行以下操作:
从0开始,将2乘以0(eek),转到1,…
所以很明显,对于乘法,我必须得到这样的订单:
0 | 1 | 2
---------
A - - 2
B 0 0 1
然后,一切都会清楚:从0开始,将0乘以0,转到1,将0乘以0,转到2,乘以1乘以2
>如何设置将数字转换为正确的乘法形式?
>我不想做任何阵列移动/翻转 – 我需要性能!
解决方法:
>为什么你在[0..9]中使用short来存储数字就足够了
>你错误地想到了乘法.在乘法的情况下,你需要一个双循环,它将B与A中的每个数字相乘,并将它们与正确的10次幂相加.
编辑:由于一些匿名低估了这个没有评论这基本上是乘法算法:
bigint prod = 0
for i in A
prod += B * A[i] * (10 ^ i)
B与A [i]的乘法是通过额外的for循环完成的,您还可以跟踪进位. (10 ^ i)是通过偏离目标索引来实现的,因为bigint在基数10中.