Проблема 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 шт):
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)
ну так напишите сначала алгоритм словами и решение станет понятным
код:
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])
Наивное решение таково:
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
А вот ещё такое "функциональное" решение, при этом, мне кажется, простое и понятное:
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, кстати) - Преобразуем числа в строки
- Берём длину этих строк
- Суммируем