Stack Overflow на русском Asked by Scourde on February 19, 2021
Задачка с Codewars. На вход даётся 2 числа: 1-е число (a
): основание степени; 2-е число (b
): показатель степени. Нужно вывести последнее число этого возведения. (Например, 7 ** 2
возвращает 9
, т.к. 7 ** 2 = 49
, последняя цифра 9
). Я выполнил эту задачу. Но, я уверен, что решение можно было написать лучше.
Мой код:
def last_digit(a, b):
last_digit_2 = [2, 4, 8, 6] #В этих четырех массивах хранятся возможные последние цифры возведения
last_digit_3 = [3, 9, 7, 1] #чисел, оканчивающихся на данные цифры (2, 3, 7, 8)
last_digit_7 = [7, 9, 3, 1] #Т.е. если например возвести число, оканчивающиеся на 2 (например 32)
last_digit_8 = [8, 4, 2, 6] #в любую степень, то это возведение будет оканчиваться только на 2,4,8,6
a = str(a)
if b == 0: #Если показатель степени 0
return 1
if a[-1] in ['0', '1', '5', '6']: #Если числа заканчиваются на 0, 1, 5, 6
return int(a[-1])
if a[-1] == '4' and b % 2 == 0: # Если число оканчивается на 4 и показатель степени четный...
return 6
elif a[-1] == '4' and b % 2 != 0: #...и нечетный
return 4
if a[-1] == '9' and b % 2 == 0: #и так далее
return 1
elif a[-1] == '9' and b % 2 != 0:
return 9
if a[-1] == '2':
return last_digit_2[(b % 4) - 1] #Например a = 32, b = 325, (325 % 4) - 1 = 0, в нашем массиве
if a[-1] == '3': #всех возможных окончаний возведения числа, оканчивающегося
return last_digit_3[(b % 4) - 1] #на 2, 0 = 2, следовательно окончания возведения 32 в 325
if a[-1] == '7': #степень равно 2.
return last_digit_7[(b % 4) - 1] #и так далее.
if a[-1] == '8':
return last_digit_8[(b % 4) - 1]
Больше всего в моем решении меня напрягает большое количество циклов if
. Можно ли как-то записать все в более компактном виде, не теряя в функциональности?
def last_digit(a, b):
return pow(a, b, 10)
>>> print(last_digit(3 ** 4 ** 5, 4 ** 5 ** 6))
1
Answered by extrn on February 19, 2021
Иногда не нужны даже массивы: https://ideone.com/Uv56UH
x = int(input())
p = int(input())
print((x%10) ** (1+(p+3)%4) % 10 if p else 1)
Answered by Qwertiy on February 19, 2021
a = [[0],[1],[2,4,8,6],[3,9,7,1],[4,6],[5],[6],[7,9,3,1],[8,4,2,6],[9,1]]
x = int(input()) % len(a)
p = int(input()) % len(a[x])
print(a[x][p-1])
PS: Как удобно, что в питоне индекс -1
работает как последний элемент.
Answered by Qwertiy on February 19, 2021
def last_digit(a, b):
return str(a ** b)[-1]
Answered by Gladius on February 19, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP