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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2018, 09:32   #1
Filister
Новичок
Джуниор
 
Регистрация: 25.11.2018
Сообщений: 1
По умолчанию Логическая задача в С++

Доброго времени суток, прошу Вас, как опытного пользователя данного сайта, помочь хотя бы как-то с логической задачей, на которую вы уже отвечали.
Учитель написал на доске некое натуральное число. После этого первый ученик сказал: "Это число делится на 1". Второй сказал: "Это число делится на 2",..., 50-й сказал: "Это число делится на 50". И, что интересно, только двое из них были неправы. Более того, два неверных утверждения были сделаны подряд одно за другим. Какое наименьшее число мог написать на доске учитель?
С языком только начинаю знакомиться, вот с этой задачей какой-то ступор, буду ждать от вас ответа.
Filister вне форума Ответить с цитированием
Старый 25.11.2018, 15:44   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Предположу, что эту можно решать - "по умному" - выбирая подходящее число аналитически, либо можно попытаться решить задачку "лоб" - перебирая числа,
получаемые из произведения из 2*3*4*5*6*7*8..*50 но без двух делителей подряд.
но в этом случае явно потребуется длинная арифметика (50! это очень большое число и в разрядную сетку не влезет).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.11.2018, 22:26   #3
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Ну во-первых, не 50!, а более маленькое число - НОК этих чисел.
То есть 2^5 * 3^3 * 5^2 * 7^2 * 11 * 13 * 17 * 19 * 23 * 29 * 31 * 37 * 41 * 43 * 47 = 3099044504245996706400
Во-вторых, раз два неверных утверждения были сделаны подряд одно за другим, одно из них - про чётное число 2*k. А это по условиям задачи означает, что N делится на 2 и делится на k, но не делится на 2*k. Вариант только один, число делится на 16, но не делится на 32. Значит, второй неправильный ответ - либо 31, либо 33. Значит, исключаем 2 и 31. Остаётся 2^4 * 3^3 * 5^2 * 7^2 * 11 * 13 * 17 * 19 * 23 * 29 * 37 * 41 * 43 * 47 = 49984588778161237200
Black Fregat вне форума Ответить с цитированием
Старый 25.11.2018, 22:30   #4
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Код:
N = 49984588778161237200
for i in range (2, 51):
    print(i, "->", "нет" if N % i else "да")
Black Fregat вне форума Ответить с цитированием
Старый 25.11.2018, 22:53   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Ну во-первых, не 50!, а более маленькое число - НОК этих чисел.
То есть 2^5 * 3^3 * 5^2 * 7^2 * 11 * 13 * 17 * 19 * 23 * 29 * 31 * 37 * 41 * 43 * 47 = 3099044504245996706400
Во-вторых, раз два неверных утверждения были сделаны подряд одно за другим, одно из них - про чётное число 2*k. А это по условиям задачи означает, что N делится на 2 и делится на k, но не делится на 2*k. Вариант только один, число делится на 16, но не делится на 32. Значит, второй неправильный ответ - либо 31, либо 33. Значит, исключаем 2 и 31. Остаётся 2^4 * 3^3 * 5^2 * 7^2 * 11 * 13 * 17 * 19 * 23 * 29 * 37 * 41 * 43 * 47 = 49984588778161237200
Класс! Брависсимо!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.11.2018, 11:24   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Black Fregat Одна мысль - в две головы Я вот - что-то не спалось под утро - и думая над этой задачей, пришел к тому же выводу. Но опередили. Могем, когда захочем
А задачка хорошая. Олимпиадная. Не то что типичная учебная задачка: "Поменяйте местами в последнем ненулевом столбце матрицы положительные элементы с отрицательными, потом умножьте наибольшее положительное на наименьшее отрицательное, ответ запишите на туалетной бумаге и используйте по назначению" .
PS Из врожденного занудства проверил : 49984588778161237200 действительно, на всех делится, а на 31, 32 не хочет. Длинную арифметику не использовал, ну ее. Oбошелся int64.

Последний раз редактировалось digitalis; 26.11.2018 в 21:11.
digitalis вне форума Ответить с цитированием
Старый 26.11.2018, 13:09   #7
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,813
По умолчанию

а число часом не 50-ричной системе счисления записано?
так-то, если что там, запись числа покороче будет, чем в 10.с.с.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 26.11.2018, 13:25   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от NetSpace Посмотреть сообщение
а число часом не 50-ричной системе счисления записано?
так-то, если что там, запись числа покороче будет, чем в 10.с.с.
какое число записано в 50-ричной системе счисления?
И какое отношение длина записи числа в разных СС имеет к данной задаче?
К чему ваш пост?!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Логическая задача jura_k Свободное общение 8 09.10.2017 03:46
Логическая задача Эльдар 18 Помощь студентам 4 10.06.2011 17:30
Логическая задача FCShadow Помощь студентам 3 23.12.2010 17:54
логическая задача. Karlsson))) Паскаль, Turbo Pascal, PascalABC.NET 1 19.12.2010 10:34
Логическая задача Senator Помощь студентам 1 06.06.2008 04:01