请问高手如何实现大数相除的算法(知道的给出链接)

时间:2022-02-16 03:45:53
一直很郁闷,我手头有一篇论文,但他讲的我没有读懂,知道的达人或者以前做过的大侠,可以指点一下!
我的思想是用数组存储,但是存储以后的算法不会.见有的兄弟说用减法实现,但是我觉得对于int[]/int[]是不太容易的事情!

高手指点,拜谢!
贴出源码,或是给出算法都可以!

8 个解决方案

#1


看见有人摆擂台,自己顶一个,不要逼我,我要用减法了

#2


可以把两个int[]的数变2进制,做减法就轻松了

#3


快速除法是通过乘法运算实现的。
比如现在有两个实数a,b,我们要计算b/a,可以先计算1/a,
1/a可以通过迭代实现:
x'=x*(2-a*x),
迭代收敛的速度很快。
然后计算b*(1/a)就可以计算出b/a.
而对于整数运算,我们需要将定点数看成是浮点数就可以了。
比如b/a, 其中2^(M-1)<=a<2^M,那么我们可以把a看成是a/2^M
我们需要计算(b/2^M)/(a/2^M).
然后计算a/2^M的倒数x,由于提供的乘法运算应该是整数(定点)运算,我们在实际计算过程中
直接使用y=x*2^M,通过迭代下面程序
y'=y*(2*2^M-(a*y)/2^M)
就可以解得y,得到a*y约等于2^(2M)
于是(b*y)/2^(2M)就是最终结果。
上面计算过程中假设数据是二进制表示的,如果是10进制表示,将2^M用10^N代替就可以了。

#4


m

#5


mathe的是数值算法吗?
我要的是除法的精确算法,象手工算的那样,比如:1/3=0.33333333333333
最后的保留小数点后多少位有用户确定,比如说32位,只要计算到32位,后面
就割掉了,不存在四舍五入

#6


是精确计算,公式中:y'=y*(2*2^M-(a*y)/2^M)
全部数字都是整数,而其中除2^M通过2进制移位运算来进行。
迭代若干步后y'就等于y了,这时必然有:
|y-b/a|<1
那么y,y+1,y-1中必然有一个数是精确值了。

#7


把数字存在数组里,然后就像手工除法一样,一位位得商,余数, 不行吗?

#8


说的容易,做的难,我现在用的是减法,估计效率不高

#1


看见有人摆擂台,自己顶一个,不要逼我,我要用减法了

#2


可以把两个int[]的数变2进制,做减法就轻松了

#3


快速除法是通过乘法运算实现的。
比如现在有两个实数a,b,我们要计算b/a,可以先计算1/a,
1/a可以通过迭代实现:
x'=x*(2-a*x),
迭代收敛的速度很快。
然后计算b*(1/a)就可以计算出b/a.
而对于整数运算,我们需要将定点数看成是浮点数就可以了。
比如b/a, 其中2^(M-1)<=a<2^M,那么我们可以把a看成是a/2^M
我们需要计算(b/2^M)/(a/2^M).
然后计算a/2^M的倒数x,由于提供的乘法运算应该是整数(定点)运算,我们在实际计算过程中
直接使用y=x*2^M,通过迭代下面程序
y'=y*(2*2^M-(a*y)/2^M)
就可以解得y,得到a*y约等于2^(2M)
于是(b*y)/2^(2M)就是最终结果。
上面计算过程中假设数据是二进制表示的,如果是10进制表示,将2^M用10^N代替就可以了。

#4


m

#5


mathe的是数值算法吗?
我要的是除法的精确算法,象手工算的那样,比如:1/3=0.33333333333333
最后的保留小数点后多少位有用户确定,比如说32位,只要计算到32位,后面
就割掉了,不存在四舍五入

#6


是精确计算,公式中:y'=y*(2*2^M-(a*y)/2^M)
全部数字都是整数,而其中除2^M通过2进制移位运算来进行。
迭代若干步后y'就等于y了,这时必然有:
|y-b/a|<1
那么y,y+1,y-1中必然有一个数是精确值了。

#7


把数字存在数组里,然后就像手工除法一样,一位位得商,余数, 不行吗?

#8


说的容易,做的难,我现在用的是减法,估计效率不高