我试图找出一个算法,用于将一个大数字与其他大数字分开(最多约200个数字),并且这两个数字都以小数形式存储为字符串。
我不能使用学校的经典算法,因为分隔符需要存储为一些经典类型(long long int等)。
我把它作为一种练习,所以效率或类似的东西不是这里的问题 - 只是最简单的方式(不像Furier ......)。
我发现的所有简单算法都非常复杂或不符合我的需要。我发现它只能通过加,减和乘法来解决,但绝对不知道我怎么能找到任何可靠的基础知识。
谢谢
答案 0 :(得分:3)
您可以使用除法指令生成部分商来加速长除法。将被除数的前导1或2位除以除数的前导数位1,这将低估商数。然后将除数(全长)乘以商数,并从被除数中减去。第二次重复此操作,商数应正确或小于应有的数字1。将被除数的前导数字与除数数字进行比较,看看商数是否可以增加+1,然后重复乘(减1)/减去。
除数为29,使用前导数字+ 1 = 2 + 1 = 3进行整数除法产生部分商:
620
-----
11
510
-----
29 |17999
145
---
34
29
---
59
29
--
30
29
--
19
0
--
19
17999/29 = 620,其余为19
为了解释这一点,除数是29,所以用3来产生部分商。第一个部分商是17/3 = 5.然后从179 = 34乘以/减去除数5.下一个部分商是3/3 = 1.从34 = 05.05乘以/减去<除数,所以这一步完成,商数为5 + 1 = 6.
下一个部分商数字是5/3 = 1.乘/减= 30. 3/3 = 1,乘/减= 1. 1<除数如此完成。商数位= 1 + 1 = 2.
下一个部分数字是1/3 = 0. 19是<除数如此完成。 quotient = 620,余数= 19。
注意,如果除数的第一个数字是9,那么使用9 + 1 = 10计算部分商,所以部分商=除数的前导数/ 10。你还必须转换两个为了进行每个除法步骤,将被除数的前导数字转换为整数(除了仅使用被除数的一个前导数字或伪造前导零的初始步骤之外)。
答案 1 :(得分:0)
我刚刚发现了什么是我的问题,这真的很微不足道 - 我不确定如何划分大于例如long int
这里的解决方案是通过减法来实现的。因此我将使用长除法。
谢谢,抱歉愚蠢的问题