Проблема c реализацией задачи на Python

У меня проблема с реализацией кода для задачи.Проблема состоит в том,что после ввода числа ничего не происходит.

Эскалатор состоит из N ступенек, пронумерованных числами от 1 до N. На ступеньках с номерами кратными 10 и на первой и последней краской пишут их номера. При надписи номера, на каждую цифру тратится одинаковое количество краски. Чтобы подсчитать объем краски, которую надо потратить на номера, необходимо знать сколько цифр будет написано. Создайте программу, которая определяет, сколько всего цифр будет использовано в номерах подписанных ступенек. Формат входных данных. В строке задается одно целое число n - количество ступенек эскалатора (1≤N≤100000)

Input  Output
20      5
23      7
n = int(input(""))
q = 0
s = 1
d = 0
d1 = 0
if n == 1:
    n1 = n % 10
    n2 = n / 10
while n > 9:
     n // 10
     q + 10
     s += (d-d1) * q
     d1 = d
     d = d * 10 + 9
n2 -= d / 10
s += n2 * q
s += n1 * 1
print(s)

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

Автор решения: Gladius
n = int(input())

if n == 1:
    print(1)
else:
    summa = 1 + len(str(n))
    for i in range(2, n):
        if i % 10 == 0:
            summa += len(str(i))
    print(summa)

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

ну так напишите сначала алгоритм словами и решение станет понятным

код:

n = int(input())

i = 1

count = 0

# просмотреть все ступеньки
while i <= n:
    # на ступеньки наносятся числа: первое, последнее и кратное 10
    if i == 1 or i % 10 == 0 or i == n:
        # увеличиваем счётчик на кол-во цифр в числе i
        count += len(str(i))

    i += 1

print(count)

ну и для любителей решения в одну строку:

n = int(input())

count = sum([len(str(i)) for i in range(1, n + 1) if i == 1 or i % 10 == 0 or i == n])

print(count)

если хочется немного на буквах поэкономить:

count = sum([len(str(i)) for i in range(1, n + 1) if i in [1, n] or i % 10 == 0])
→ Ссылка
Автор решения: vp_arth

Наивное решение таково:

def solution(n):
    result = 0
    for i in range(1, n+1):
        if i == 1:
            result += 1
        elif i == n:
            result += len(str(n))
        elif i % 10 == 0:
            result += len(str(i))

    return result

Если немного оптимизировать цикл:

def solution(n):
    result = (n > 0) + (n > 1) * len(str(n))
    for i in range(10, n, 10):
        result += len(str(i))

    return result

def solution(n):
    result = (n > 0) + (n > 1 and n % 10 != 0) * len(str(n))

    k = n // 10

    result += k # все последние нули

    # Количество цифр от 1 до k
    i = 1
    while i <= k:
        result += k - i + 1
        i *= 10

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

А вот ещё такое "функциональное" решение, при этом, мне кажется, простое и понятное:

def paint_check(n):
    return sum(map(len, map(str, set([1] + list(range(10, n, 10)) + [n]))))

assert(paint_check(1) == 1)
assert(paint_check(20) == 5)
assert(paint_check(23) == 7)
  • Просто делаем список из 1; чисел, делящихся на 10; и n.
  • Исключаем повторы с помощью set (повториться при таком подходе может только 1, кстати)
  • Преобразуем числа в строки
  • Берём длину этих строк
  • Суммируем
→ Ссылка