【问题标题】:Most efficient way to find the last digit of a^b查找 a^b 的最后一位数字的最有效方法
【发布时间】:2017-07-08 07:01:21
【问题描述】:

我是 python 新手。我希望以最有效的方式计算(a ** b) % 10(即简化电源部分)。我找到了一种方法:((a % 10) ** b) % 10。我的问题是,有没有更有效的方法来做到这一点?此问题是 CodeFights 任务的扩展。原问题接受(a ** b) % 10

【问题讨论】:

    标签: number-theory


    【解决方案1】:
    • 由于数字 mod 10 形成 ring,因此您可以在每个中间值处计算余数 mod 10 而不会影响结果。

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

      基本思想是,即使是b,我们也可以将参数平方 并将指数除以 2 而不改变结果。 对于奇数b,我们提取a(或我们当前的参数)的一次幂,然后像偶数情况一样进行处理(平方和减半)。

    因此,将这些放在一起,如果您实现平方乘法算法并在每一步之后计算余数 mod 10,您将有一个很好且有效的方法来计算您的最后一个数字。

    【讨论】:

    • 谢谢!我还找到了另一种方法。此方法获取a mod 10 的所有残基,然后找到一个模式。我用字典来做模式映射。我批准了您的解决方案,因为它比我的新解决方案更有效。
    【解决方案2】:
    • 第 1 步: 将输入 ab 作为字符 字符串
    • 第 2 步:
      • 仅将 a 的最后一个字符转换为 integer 并存储在变量中,例如 m
      • 仅将 b 的最后两个字符转换为 integer 并存储在变量中,例如 n。 如果 b 是单个字符,则仅转换此字符。
    • 第 3 步: 找到 x。 if n % 4 == 0: x = 4 else: x = n % 4
    • 第 4 步: last_digit = (m ** x) % 10

    简短说明: 如果你列出一个权力的初始扩张,你会发现一个模式。 所以我们可以将 ab 简化为 m > 和 x。 因为它只是最后一个数字。

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

    【讨论】:

      猜你喜欢
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      相关资源
      最近更新 更多