Found this on Codewars. The function takes two arguments A and B and returns the last digit of A^B. The code below passes the first two test cases, but won't pass the next ones.
def last_digit(n1, n2):
number = n1**n2
if number % 2 == 0:
return number % 10
elif number % 2 != 0:
return number % 10
Test.it("Example tests")
Test.assert_equals(last_digit(4, 1), 4)
Test.assert_equals(last_digit(4, 2), 6)
Test.assert_equals(last_digit(9, 7), 9)
Test.assert_equals(last_digit(10, 10 ** 10), 0)
In general, the last digit of a power in base n n n is its remainder upon division by n n n.
To find last digit of a number, we use modulo operator %. When modulo divided by 10 returns its last digit.
Don't compute n1**n2
. The problem comes when you attempt to compute:
10**(10**10)
That is a 1 followed by ten billion zeroes.
Use pow(n1, n2, 10)
this makes the problem (more) tractable as it computes the exponentiation modulo 10
. Then as the number is already reduced modulo 10 the function can be rewritten as:
def last_digit(n1, n2):
return pow(n1, n2, 10)
Problem is easy to solve once you realize that the last digits of powers form a cycle. For example:
2: 2, 4, 8, 6, 2, 4
3: 3, 9, 7, 1, 3, 9
With that in mind you can create the cycle first and then just index it with modulo of n2
:
def last_digit(n1, n2):
if n2 == 0:
return 1
cycle = [n1 % 10]
while True:
nxt = (cycle[-1] * n1) % 10
if nxt == cycle[0]:
break
cycle.append(nxt)
return cycle[(n2 - 1) % len(cycle)]
This is also faster than using pow
:
def last_digit_pow(n1, n2):
return pow(n1, n2, 10)
if __name__ == '__main__':
import timeit
print(timeit.timeit("last_digit(10, 10 ** 10)", setup="from __main__ import last_digit"))
print(timeit.timeit("last_digit_pow(10, 10 ** 10)", setup="from __main__ import last_digit_pow"))
Output (Windows 8 & Python 2.7):
0.832171277335
4.08073167307
Output (Windows 8 & Python 3.5):
0.6951034093766606
1.9045515428013722
Output with 10**100
(Windows 8 & Python 3.5):
0.8367381690724996
10.928452962508006
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With