找到^ b的最后一位数的最有效方法

时间:2017-07-08 07:01:22

标签: number-theory

我是一个蟒蛇新手。我希望以尽可能最有效的方式计算result = np.zeros(4000,64*9) ind = 0 for i in range(64): for j in range(9): result[:,ind]= tf.muliply(F[:,i]),M[:,j]) ind += 1 (即简化功率部分)。我找到了一种方法:(a ** b) % 10。我的问题是,有更有效的方法吗?此问题是CodeFights任务的扩展。原始问题已被接受((a % 10) ** b) % 10

2 个答案:

答案 0 :(得分:1)

  • 由于数字 mod 10 形成ring,您可以在每个中间值计算残差 mod 10 ,而不会影响结果。< / p>

  • 有一个名为Square-and-multiplyO(log b)步骤算法可以大大加快您的计算速度。

    基本思想是,即使b,我们也可以对论证进行平方 并且在不改变结果的情况下将指数除以2。 对于奇数b,我们提取a(或我们当前的参数)的一个幂,并在偶数情况下进行(平方和减半)。

所以把它放在一起,如果你实现了Square-and-multiply算法并在每一步之后计算残差 mod 10 ,那么你将有一种很好而有效的方法来计算你的最后一位数。 / p>

答案 1 :(得分:1)

  • 第1步:将输入 a b 作为字符<强>字符串
  • 第2步:
    • 仅将 a 的最后一个字符转换为整数并存储在变量中 m 即可。
    • 仅将 b 的最后两个字符转换为整数并存储在变量中 n 即可。 如果 b 是单个字符,则仅转换此字符。
  • 第3步:找到x。 if n % 4 == 0: x = 4 else: x = n % 4
  • 第4步: last_digit = (m ** x) % 10

简短说明: 如果列出电源的初始扩展,您将找到一种模式。 因此,我们可以将 a b 减少为 m x 。 因为它只是最后一位数。

您可以访问:this site for the better explanation to find out last digit of a^b