Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Как купить рекламу на форуме


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

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


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

Здравствуйте.
Я учусь в 8-ом классе и готовлюсь к олимпиаде по информатике. Сюда буду скидывать все задачи, которые мне не удалось решить. Если кто поможет с решениями, буду благодарен.
FsGaCh вне форума Ответить с цитированием
Старый 03.05.2020, 21:51   #2
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Найти количество натуральных чисел, не превосходящих N, и обладающих свойством: число, полученное записью цифр этого числа в обратном порядке, делится на все свои цифры.

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

Натуральное число N (1 <= N <= 10000).

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

Одно искомое число.


Мой вариант:
Код:
n = input()
count = 0
count1 = 0
for i in range(int(n)):
    count1 = 0
    for k in str(i)[::-1]:
        if k != '0' and i != 0:
            if int(str(i)[::-1]) % int(k) == 0:
                count1 += 1
        if count1 == len(str(i)):
            count += 1
print(count)
FsGaCh вне форума Ответить с цитированием
Старый 03.05.2020, 21:53   #3
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Найти количество натуральных чисел, не превосходящие заданного N, в десятичной записи которых нет одинаковых цифр.

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

Натуральное число N (1 <= N <= 10000).

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

Одно искомое число.
FsGaCh вне форума Ответить с цитированием
Старый 04.05.2020, 10:19   #4
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Требуется вычислить сумму произведений цифр всех k-значных чисел. Для k=3 искомая сумма представлена следующим рядом:
S = 1*0*0 + 1*0*1 + 1*0*2 + … + 9*9*8 + 9*9*9 = 91125

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

Натуральное число k (2 <= k <= 7).

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

Одно число – сумма.
FsGaCh вне форума Ответить с цитированием
Старый 06.05.2020, 18:12   #5
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Что, никто школьником не участвовал в олимпиаде по информатике?
FsGaCh вне форума Ответить с цитированием
Старый 07.05.2020, 03:17   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 5,984
По умолчанию

Ну почему же, участвовали конечно же. Просто задачки не особо интересные, да и свои попытки вы не ко всем выкладываете.
Например, последняя задачка. Наивный подход (в лоб перебором):
Код:
k = int(input())
print(reduce(lambda a, b : a + b, (reduce(lambda a, b : a * b, map(int, list(str(i)))) for i in xrange(10 ** (k - 1), 10 ** k))))
Но для k = 7 он рассчитывается за 34 секунды, что точно не пройдет по времени.
Если немного подумать, то можно заметить закономерность между предыдущим и следующим расчетом k. А затем, упростив:
Код:
k = int(input())
print(45 ** k)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 09.05.2020, 12:25   #7
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Отредактировал второй проект.

Цитата:
Сообщение от FsGaCh Посмотреть сообщение
Найти количество натуральных чисел, не превосходящие заданного N, в десятичной записи которых нет одинаковых цифр.

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

Натуральное число N (1 <= N <= 10000).

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

Одно искомое число.
Уже выполнено, вот так:
Код:
n = int(input())
count = 0
spisok = []
for i in range(n):
    spisok = []
    for k in str(i):
        if not(k in spisok):
            spisok.append(k)
        if len(str(i)) == len(spisok):
            count += 1
print(count)

Последний раз редактировалось FsGaCh; 09.05.2020 в 12:32.
FsGaCh вне форума Ответить с цитированием
Старый 09.05.2020, 12:40   #8
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Ну почему же, участвовали конечно же. Просто задачки не особо интересные, да и свои попытки вы не ко всем выкладываете.
Например, последняя задачка. Наивный подход (в лоб перебором):
Код:
k = int(input())
print(reduce(lambda a, b : a + b, (reduce(lambda a, b : a * b, map(int, list(str(i)))) for i in xrange(10 ** (k - 1), 10 ** k))))
Но для k = 7 он рассчитывается за 34 секунды, что точно не пройдет по времени.
Если немного подумать, то можно заметить закономерность между предыдущим и следующим расчетом k. А затем, упростив:
Код:
k = int(input())
print(45 ** k)
Прежде всего спасибо ВАМ за участие! Для меня это очень важно.

Я проверил, всё работает. Но хотел бы вас спросить о функции reduce(). Я когда вводил первый вариант, программа вывела что, фунция reduce() не найдена (Я использую Python 3.7). Думаю, это из-за версии. А какая альтернатива reduce() существует в более новых версиях?
FsGaCh вне форума Ответить с цитированием
Старый 09.05.2020, 19:18   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 5,984
По умолчанию

Да, в третьем питоне reduce переехал в functools. И xrange стал range.
Код:
from functools import reduce

k = int(input())
print(reduce(lambda a, b : a + b, (reduce(lambda a, b : a * b, map(int, list(str(i)))) for i in range(10 ** (k - 1), 10 ** k))))
Альтернативой выступает просто for. Но это как-то скучнее. Зато время расчета чуть меньше.
Код:
k = int(input())
s = 0
for i in range(10 ** (k - 1), 10 ** k):
    prd = 1
    for j in str(i):
        prd *= int(j)
    s += prd
print(s)
По поводу задачи с количеством чисел с разными цифрами. Во-первых, range(n) даст числа [0, n-1], а нужны [1, n]. Во-вторых, можно задействовать больше возможностей языка, например, множества.
Код:
n = int(input())
count = 0
for i in range(1, n + 1):
    s = str(i)
    if len(set(s)) == len(s):
        count += 1
print(count)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 09.05.2020 в 19:31.
BDA вне форума Ответить с цитированием
Старый 10.05.2020, 18:25   #10
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Дано натуральное число N. Найти все его делители.
Формат входных данных
Натуральное число N (1 <= N <= 109).
Формат выходных данных
В одной строке вывести все делители числа, разделенные одним пробелом.

Я выполнил, если можно, скажите, как упростить:
Код:
n = int(input())
all = ''
for i in range(1, n+1):
    if n % i == 0:
        all = all + str(i) + ' '
print(all)
FsGaCh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме 20000 рублей в месяц

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

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


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


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS