Подсчитать количество чисел в заданном диапазоне куб которых оканчивается на 4 или 9

Количество чисел

На вход программе подаются два целых числа a и b (a≤b). Напишите программу, которая подсчитывает количество чисел в диапазоне от a до b включительно, куб которых оканчивается на 4 или 9.

Формат входных данных

На вход программе подаются два целых числа a и b (a≤b).

Формат выходных данных

Программа должна вывести одно целое число в соответствии с условием программы. Примечание. Куб числа aa – это его третья степень a^3a.

Sample Input 1:

1
10

counter = 0
for i in range(int(input()), int(input())):
    if i % 10 == 4:
        counter = counter + 1
print(counter)
    else:
        i % 10 == 9
        counter = counter + 1
        print(counter)

Ответы (4 шт):

Автор решения: Егор

Пояснения насчет кубов: 3 в кубе= 27, оканчивается на семь; 4 в кубе= 64, оканчивается на 4 - подходит нам по условию задачи. Нам надо "выловить" эту конечную цифру числа, проверить (вдруг она является 4-кой или 9-кой) и подсчитать количество таких случаев в заданном диапазоне.

Вот кубы первых 9 чисел (можете сами себе такой цикл составить, чтобы на них посмотреть и лучше понять, что просят сделать):

1**3 = 1
2**3 = 8
3**3 = 27
4**3 = 64
5**3 = 125
6**3 = 216
7**3 = 343
8**3 = 512
9**3 = 729
→ Ссылка
Автор решения: MaxU

Если обратить внимание на кубы чисел, которые заканчиваются на 4 и 9, то можно увидеть закономерность - если число заканчивается на 4 или на 9, то и куб этого числа будет заканчиваться на ту же цифру:

In [81]: [(i, i**3) for i in range(70) if (i**3) % 10 in (4,9)]
Out[81]: 
[(4, 64),
 (9, 729),
 (14, 2744),
 (19, 6859),
 (24, 13824),
 (29, 24389),
 (34, 39304),
 (39, 59319),
 (44, 85184),
 (49, 117649),
 (54, 157464),
 (59, 205379),
 (64, 262144),
 (69, 328509)]

поэтому ответ можно получить аналитически:

def f(a, b, digit):
    a = a // 10 * 10 + digit
    b = b // 10 * 10 - (10 - digit)
    return (b - a + 10) // 10

def calc(a, b):
    return f(a, b, 4) + f(a, b, 9)

a, b = 123, 321

res = calc(a, b)

результат:

In [185]: res
Out[185]: 40

проверка:

In [186]: len([(i, i**3) for i in range(a, b+1) if (i**3) % 10 in (4,9)])
Out[186]: 40


→ Ссылка
Автор решения: Semitron

Может сразу прийти такое решение в голову:

a, b = int(input()), int(input())
counter = 0
for i in range(a,b+1):
    if i ** 3 % 10 == 4 or i ** 3 % 10 == 9:
        counter += 1
print(counter)

Но если внимательно вникнуть в задание, то можно понять, что нет смысла напрягать компьютер лишний раз и можно не возводить в куб числа:

a = int(input())
b = int(input())
counter = 0
for i in range(a, b + 1):
    if i % 10 == 4 or i % 10 == 9:
        counter += 1
print(counter)
→ Ссылка
Автор решения: Stanislav Volodarskiy

По соседству уже заметили что если куб числа заканчивается на четыре или девять то и само число оканчивается на четыре или девять.

По соседству также предложили считать количество таких чисел аналитически, только чуть-чуть ошиблись в реализации.

Сколько чисел d, 0 ≤ d < n оканчивается на цифру четыре? k4(n) = ⌊d+5/10.

Сколько чисел d, n1 ≤ d ≤ n2 оканчивается на цифру четыре? k4(n1, n2) = k4(n2 + 1) - k4(n1).

Аналогичные формулы для девятки: k9(n) = ⌊d/10, k9(n1, n2) = k9(n2 + 1) - k9(n1)

Что приводит к такой программе:

def k_(d, n):
    return (n + 9 - d) // 10


def k(d, n1, n2):
    return k_(d, n2 + 1) - k_(d, n1)


n1, n2 = map(int, input().split())
print(k(4, n1, n2) + k(9, n1, n2))
→ Ссылка