TransWikia.com

Можно ли усовершенствовать этот код?

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. Можно ли как-то записать все в более компактном виде, не теряя в функциональности?

4 Answers

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

https://ideone.com/mVUXO6

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP