修改
所以我似乎“低估了”不同长度数字的含义。我甚至没想过操作数是100位数的情况。在那种情况下,我提出的算法绝对没有效率。我可能需要一个实现,其复杂性取决于每个操作数中的数字位数而不是数值,对吧?
如下所示,我将研究Karatsuba算法......
编写一个算法的伪代码,该算法包含两个任意长度的数字(以字符串形式提供),并计算这些数字的乘积。使用有效的过程来增加大量任意长度。分析算法的效率。
我决定采用(半)简单方法并使用俄罗斯农民算法。它的工作原理如下:
a * b = a/2 * 2b if a is even
a * b = (a-1)/2 * 2b + a if a is odd
我的伪代码是:
rpa(x, y){
if x is 1
return y
if x is even
return rpa(x/2, 2y)
if x is odd
return rpa((x-1)/2, 2y) + y
}
我有3个问题:
非常感谢提前
答案 0 :(得分:1)
通过提供任意长度的数字“作为字符串”,我的教授可能意味着什么。为什么这样做?
这实际上改变了有关问题的一切(并使您的算法不正确)。 这意味着1234作为1,2,3,4提供,你不能直接操作整数。您需要根据#additions,#multiplication,#divivs来分析算法。 你应该期望一个除法比一个乘法更贵,而且乘法比一个加法要贵得多。因此,一个好的算法会尝试减少分割和乘法的次数。
查看Karatsuba algorithm,(ps不要复制它不是教师想要的)是本规范中最快的之一。
答案 1 :(得分:0)
添加3):本机整数受限于它们可以表示的大(或小)数(例如,32位或64位整数)。要表示任意长度的数字,您可以选择字符串,因为那时您并不受此限制。当然,问题是你的算术单位并没有真正添加字符串; - )