Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2020, 17:18   #21
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Это задание я смог выполнить, но хочу узнать как можно упростить:

Однажды в сундуке своего дедушки Алпай нашёл электронный калькулятор. Цифры на нём отображались с помощью семи сегментных индикаторов. Например, для изображения цифры 0 отображаются (становятся черными) 6 сегментов, цифры 7 – 3 сегмента.
Алпай стал по очереди набирать на калькуляторе все числа, находящиеся между двумя некоторыми целыми числами a до b, включая и сами эти числа. После набора каждого числа Алпай считал количество появившихся сегментов и нажимал кнопку сброса. А потом он решил сделать программу, которая сама подсчитает общее количество сегментов, которые отобразятся на калькуляторе при наборе всех этих чисел. Помогите Алпайу это сделать.

Например, если a = 1 и b = 3, то на калькуляторе сначала отобразится 2 сегмента, затем – 5 и снова отобразится 5 сегментов. Таким образом, общее количество отображённых сегментов будет равно 12.


Входные данные:
В единственной строке находится пара целых чисел a, b (1 ≤ a , b ≤ 106).


Выходные данные:
Выведите одно целое число – общее количество отображённых сегментов.


Мой вариант:
Код:
ab = input()
ab = ab.split()
a = int(ab[0])
b = int(ab[1])
segments = 0
for i in range(a, b+1):
    for k in str(i):
        if k == '0':
            segments += 6
        elif k == '1':
            segments += 2
        elif k == '2':
            segments += 5
        elif k == '3':
            segments += 5
        elif k == '4':
            segments += 4
        elif k == '5':
            segments += 5
        elif k == '6':
            segments += 6
        elif k == '7':
            segments += 3
        elif k == '8':
            segments += 7
        elif k == '9':
            segments += 6
print(segments)

Последний раз редактировалось FsGaCh; 17.05.2020 в 17:37.
FsGaCh вне форума Ответить с цитированием
Старый 17.05.2020, 18:50   #22
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

По поводу простых делителей. Это практически тоже самое, что и поиск делителей числа. Только нужно оставить те делители, которые сами являются простыми числами.
Код:
n = int(input())
k = n
t = ceil(sqrt(n))
for i in range(2, t + 1):
    if k % i == 0:
        print("%d " % i, end = '')
    while k > 1 and k % i == 0:
        k = k / i
    if k == 1:
        break
if k > 1:
    print("%d" % k, end = '')
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.05.2020, 19:44   #23
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Цитата:
Однажды в сундуке своего дедушки Алпай нашёл электронный калькулятор.
А это моя версия
Код:
a, b = input().split()
a = int(a)
b = int(b)
segments = 0
for i in range(a, b+1):
    for k in str(i):
        segments += 2
        if k == '0' or k == '6' or k == '9':
            segments += 4
        elif k == '2' or k == '3' or k == '5':
            segments += 3
        elif k == '4':
            segments += 2
        elif k == '7':
            segments += 1
        elif k == '8':
            segments += 5
print(segments)
Тут нет проверки на '1', но нельзя закончить код оператором else
PS: Ваш код можно закончить
Код:
else:
    segments += 6
Это на проверку меньше.
Как-то так, ...
ViktorR на форуме Ответить с цитированием
Старый 17.05.2020, 20:09   #24
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Цитата:
Сообщение от FsGaCh Посмотреть сообщение
Однажды в сундуке своего дедушки Алпай нашёл электронный калькулятор
Вот и моя версия тогда. Но это просто сокращение кода. Мне кажется, должна быть формула.
Код:
a, b = map(int, input().split())
counts = [6, 2, 5, 5, 4, 5, 6, 3, 7, 6]
segments = 0
for i in range(a, b + 1):
    while i:
        segments += counts[i % 10]
        i //= 10
print(segments)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.05.2020, 22:57   #25
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Написал свой пост. Подумал о списке, но пошел ужинать.
Нет. Вроде такой формулы нет.
Давно, очень много лет тому назад (скажем так, около 40-ка), меня самого эта глупая задачка достала.
Программу я не писал, но закономерность пытался найти

PS: Понятно, что Интернета тогда не было и задачка явилась то ли от безделья, то ли от перенапряга.
Уже не помню.
Как-то так, ...
ViktorR на форуме Ответить с цитированием
Старый 18.05.2020, 03:39   #26
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Получилось достаточно быстрое решение, но, во-первых, много времени убил на написание (то есть не успеть за время очного тура олимпиады), во-вторых, к концу отладки сам уже запутался
Погонял на разных случайных входных данных, вроде работает. Может быть, можно привести и в более читаемый вид.
Код:
a, b = map(int, input().split())

count = [6, 2, 5, 5, 4, 5, 6, 3, 7, 6] # count for x
next_sum = [49, 43, 41, 36, 31, 27, 22, 16, 13, 6] # sum from x..9
prev_sum = [6, 8, 13, 18, 22, 27, 33, 36, 43, 49] # sum from 0..x

segments = 0
p = 1
a_orig, b_orig = a, b
a_not_end = True

while a or b:
    a_div, a_mod = divmod(a, 10)
    b_div, b_mod = divmod(b, 10)
    a_orig_mod, b_orig_mod = a_orig % p, b_orig % p
    segments += (prev_sum[b_mod] - count[b_mod]) * p + (b_orig_mod + 1) * count[b_mod]
    if a_not_end:
        if b_div > a_div:
            segments += (next_sum[0] * (b_div - a_div - 1) + next_sum[a_mod]) * p
            segments -= a_orig_mod * count[a_mod]
        elif a_mod:
            segments -= prev_sum[a_mod - 1] * p
            segments -= a_orig_mod * count[a_mod]
    else:
        if b_div:
            segments += (next_sum[0] * (b_div - 1) + next_sum[1]) * p
        else:
            segments -= count[0] * p 
    a, b = a_div, b_div
    if a == 0:
        a_not_end = False
    p *= 10

print(segments)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 18.05.2020 в 04:05.
BDA вне форума Ответить с цитированием
Старый 18.05.2020, 17:13   #27
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Если чесно, я не понял как работает ваша программа Это вы пытались найти формулу? Если сделать без формулы, то я думаю будет понятней для каждого: И для начинаюшего, и для ПРОграммиста.
FsGaCh вне форума Ответить с цитированием
Старый 18.05.2020, 20:27   #28
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

На олимпиадах обычно достаточно жесткие ограничения по объему используемой памяти и времени работы программы. Поэтому "наивные" алгоритмы (перебор в лоб) просто не пройдут. Например, сравнение по времени работы кода из 24 и 26 постов для разных входных данных:
Код:
input      |    24     |    26
---------------------------------
1 100      |  0.000501 | 0.000000
1 1000     |  0.000502 | 0.000000
1 10000    |  0.013563 | 0.000000
1 100000   |  0.128841 | 0.000500 
1 1000000  |  1.719062 | 0.000501
1 10000000 | 20.870593 | 0.000502
Кратко об алгоритме в 26 посте. Рассматриваю числа поразрядно, начиная с младшего разряда. Рассчитываю сумму сегментов всех цифр, которые в данном разряде будут во всех числах от A до B. Например, выпишите все числа от 15 до 39 и тогда увидите закономерность для самого младшего разряда. Станет видно, как "пробегают" цифры в младшем разряде. Чтобы не считать сумму сегментов для цифр от 0 до X и от X до 9, были введены предрассчитанные массивы.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 18.05.2020 в 20:41.
BDA вне форума Ответить с цитированием
Старый 18.05.2020, 21:07   #29
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
На олимпиадах обычно достаточно жесткие ограничения по объему используемой памяти и времени работы программы. Поэтому "наивные" алгоритмы (перебор в лоб) просто не пройдут. Например, сравнение по времени работы кода из 24 и 26 постов для разных входных данных:
Код:
input      |    24     |    26
---------------------------------
1 100      |  0.000501 | 0.000000
1 1000     |  0.000502 | 0.000000
1 10000    |  0.013563 | 0.000000
1 100000   |  0.128841 | 0.000500 
1 1000000  |  1.719062 | 0.000501
1 10000000 | 20.870593 | 0.000502
Кратко об алгоритме в 26 посте. Рассматриваю числа поразрядно, начиная с младшего разряда. Рассчитываю сумму сегментов всех цифр, которые в данном разряде будут во всех числах от A до B. Например, выпишите все числа от 15 до 39 и тогда увидите закономерность для самого младшего разряда. Станет видно, как "пробегают" цифры в младшем разряде. Чтобы не считать сумму сегментов для цифр от 0 до X и от X до 9, были введены предрассчитанные массивы.
Вы правы. Я проверил мой код, при входных данных 1 и 10000000, результат выдает за 36 сек, в вашем-меньше секунды.
FsGaCh вне форума Ответить с цитированием
Старый 24.05.2020, 16:44   #30
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Стоимость бутылки воды, учитывая стоимость пустой бутылки, составляет 1 доллар 20 сентов, а стоимость пустой бутылки 20 сентов.
Сколько бутылок воды можно выпить на n долларов, учитывая, что пустые бутылки можно сдавать, и на полученные деньги приобретать новые бутылки воды.

Входные данные:
Натуральное число n (1 ≤ n ≤ 1000).

Выходные данные:
Количество бутылок воды, которое можно выпить на n долларов.

Примечание: Вода без бутылки не продаётся.

Мой вариант, но я сомневаюсь в правильности:
Код:
n = int(input())
q = n % 1.2
am = n // 1.2
q += am * 0.2
while q >= 1.2:
    am += q // 1.2
    q = q % 1.2
print(am)

Последний раз редактировалось FsGaCh; 24.05.2020 в 17:00.
FsGaCh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
готовлюсь к олимпиаде по информатике salauat Паскаль, Turbo Pascal, PascalABC.NET 25 01.12.2013 21:32
Подготовиться к олимпиаде за лето UaKot Свободное общение 20 10.05.2013 18:53
Подготовка к региональной олимпиаде New man Помощь студентам 20 14.12.2012 21:01
Задачи по олимпиаде Darick Помощь студентам 7 23.12.2011 15:45
Как подготовиться к олимпиаде? Kn793 Помощь студентам 16 26.07.2008 12:22