我有两个保存为字符串的巨大自然数: a 和 b 。每个数字最多可以包含150个字符。我需要在合理的时间内得到 a b 的结果。
我搜索了最佳解决方案,但 a 总是很大,而 b 是整数。
我尝试了简单的解决方案:
string power(string n1, string n2) {
string result = n1;
if(n2 == "0")
return "1";
do {
result = multiply(result, n1);
n2 = decrement(n2);
}
while(n2 != "1");
return result;
}
如何在更少的时间内获得结果?
答案 0 :(得分:0)
重复使用结果时,您需要计算的量少得多。
例如: 5 ^ 8 = 5 ^ 4 * 5 ^ 4 = 5 ^ 2 * 5 ^ 2 * 5 ^ 2 * 5 ^ 2 = 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5
您不需要全部进行7次乘法,只需5 * 5、5 ^ 2 * 5 ^ 2、5 ^ 4 * 5 ^ 4(3次乘法)
以下代码是Python代码(因为我想轻松对其进行测试),但我希望您明白这一点。
SELECT c.*, a.*
FROM contacts AS c
LEFT OUTER JOIN activities AS a ON a.contact_id = c.id
LEFT OUTER JOIN (
SELECT c2.contact_id, MAX(a2.occurred_at) AS occurred_at
FROM activities AS a2
INNER JOIN contacts AS c2 ON a2.contact_id = c2.id
WHERE c2.company_id = 20
GROUP BY c2.contact_id ORDER BY NULL
) AS latest_activities
ON latest_activities.contact_id = c.id
AND latest_activities.occurred_at = a.occurred_at
WHERE c.company_id = 20
使用2而不是10时,代码应该更快。 之所以要针对您的基准调整算法,是因为可以通过删除最后一位数字来进行基准除法,因此除法运算不需要真正的计算。
这种方法所需的乘法数应该是对数,而不是线性,因此几百位数应该没问题。
您可以使用相同的方法再次优化10基代码
def powBase10(a,n):
if(n==0):
return 1
x=powBase10(a, int(n/10))
if(n%10==0):
return (x*x*x*x*x*x*x*x*x*x)
if(n%10==1):
return (a*x*x*x*x*x*x*x*x*x*x)
if(n%10==2):
return (a*a*x*x*x*x*x*x*x*x*x*x)
if(n%10==3):
return (a*a*a*x*x*x*x*x*x*x*x*x*x)
if(n%10==4):
return (a*a*a*a*x*x*x*x*x*x*x*x*x*x)
if(n%10==5):
return (a*a*a*a*a*x*x*x*x*x*x*x*x*x*x)
if(n%10==6):
return (a*a*a*a*a*a*x*x*x*x*x*x*x*x*x*x)
if(n%10==7):
return (a*a*a*a*a*a*a*x*x*x*x*x*x*x*x*x*x)
if(n%10==8):
return (a*a*a*a*a*a*a*a*x*x*x*x*x*x*x*x*x*x)
if(n%10==9):
return (a*a*a*a*a*a*a*a*a*x*x*x*x*x*x*x*x*x*x)
def powBase2(a,n):
if(n==0):
return 1
x=powBase2(a, int(n/2))
if(n%2==0):
return (x*x)
if(n%2==1):
return (a*x*x)
但这只会导致持续的加速。