大量的乘幂运算

时间:2019-01-31 20:41:32

标签: c++ algorithm

我有两个保存为字符串的巨大自然数: 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;
}

如何在更少的时间内获得结果?

1 个答案:

答案 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)

但这只会导致持续的加速。