【发布时间】:2017-07-08 07:01:21
【问题描述】:
我是 python 新手。我希望以最有效的方式计算(a ** b) % 10(即简化电源部分)。我找到了一种方法:((a % 10) ** b) % 10。我的问题是,有没有更有效的方法来做到这一点?此问题是 CodeFights 任务的扩展。原问题接受(a ** b) % 10。
【问题讨论】:
标签: number-theory
我是 python 新手。我希望以最有效的方式计算(a ** b) % 10(即简化电源部分)。我找到了一种方法:((a % 10) ** b) % 10。我的问题是,有没有更有效的方法来做到这一点?此问题是 CodeFights 任务的扩展。原问题接受(a ** b) % 10。
【问题讨论】:
标签: number-theory
由于数字 mod 10 形成 ring,因此您可以在每个中间值处计算余数 mod 10 而不会影响结果。
有一个名为Square-and-multiply 的O(log b) 步进算法可以大大加快您的计算速度。
基本思想是,即使是b,我们也可以将参数平方
并将指数除以 2 而不改变结果。
对于奇数b,我们提取a(或我们当前的参数)的一次幂,然后像偶数情况一样进行处理(平方和减半)。
因此,将这些放在一起,如果您实现平方乘法算法并在每一步之后计算余数 mod 10,您将有一个很好且有效的方法来计算您的最后一个数字。
【讨论】:
a mod 10 的所有残基,然后找到一个模式。我用字典来做模式映射。我批准了您的解决方案,因为它比我的新解决方案更有效。
if n % 4 == 0:
x = 4
else:
x = n % 4
last_digit = (m ** x) % 10
简短说明: 如果你列出一个权力的初始扩张,你会发现一个模式。 所以我们可以将 a 和 b 简化为 m > 和 x。 因为它只是最后一个数字。
您可以访问:this site for the better explanation to find out last digit of a^b
【讨论】: