|
0 / 0 / 0
Регистрация: 25.02.2016
Сообщений: 11
|
|
Каково первое треугольное число, у которого более пятисот делителей?07.10.2016, 23:29. Показов 7003. Ответов 15
Метки нет (Все метки)
Помогите, пожалуйста, с кодом. Решаю такую задачу
Последовательность треугольных чисел образуется путем сложения натуральных чисел. К примеру, 7-ое треугольное число будет 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. Первые десять треугольных чисел: 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... Перечислим делители первых семи треугольных чисел: 1: 1 3: 1,3 6: 1,2,3,6 10: 1,2,5,10 15: 1,3,5,15 21: 1,3,7,21 28: 1,2,4,7,14,28 Как мы видим, 28 - первое треугольное число, у которого более пяти делителей. Каково первое треугольное число, у которого более пятисот делителей? Есть решение данной задачи в шарпе Определить первое треугольное число, у которого более пятисот делителей Там мне запись алгоритма понятна. Что такое треугольное число и как его находить википедия подсказала А вот с хаскелем впервые столкнулся. Неожиданно оказалось, что в нем нет циклов. Вот мучаюсь, понимаю, что надо как-то применить рекурсию, но не знаю как. Дальше этого не пошло: takewhile (n>500) cons | условие 1 | условие 2
0
|
|
| 07.10.2016, 23:29 | |
|
Ответы с готовыми решениями:
15
Найти число из диапазона 1.1000, у которого сумма делителей максимальна
|
| 08.10.2016, 11:40 | ||||||||||||||||||||||||||||||||
Сообщение было отмечено Catstail как решение
Решение
UPD: Liscript (версия с рекурсивным эвалюатором) - 40 секунд ![]()
4
|
||||||||||||||||||||||||||||||||
|
1 / 1 / 0
Регистрация: 06.10.2016
Сообщений: 25
|
||||||
| 08.10.2016, 12:37 | ||||||
|
_Ivana, спасибо! Правильно ли я понял синтаксис haskell, который вы привели:
divs n = go 1 where - начинаем цикл, n:=0, i:=1 go i i*i > n = 0 - первое условие - делителей нет i*i == n = 1 - число единица, поэтому делитель только один - тоже единица n`mod`i == 0 = 2 + go (i+1) - делится нацело, число делителей увеличивается на два ("делители ходят парой") otherwise = go (i+1) - число делителей не меняем То есть таким образом решается первая подзадача - найти делители. Далее надо объявить функцию, которой в качестве аргумента передать divs n. Как я понимаю, надо решить квадратное уравнение вида 2*t(n) = n*(n+1). где t - треугольное число. n = (sqrt (1+8*t(n)) -1) /2 Следовательно, если дробная часть n равна нулю, то t - треугольное, иначе - не треугольное. Такую проверку организовать для n=500. Код на Лиспе смутно понимаю. Помогите, пожалуйста, переложить его на язык haskell
0
|
||||||
|
Супер-модератор
|
||||||
| 08.10.2016, 15:14 | ||||||
|
Вот мое решение:
1
|
||||||
|
1 / 1 / 0
Регистрация: 06.10.2016
Сообщений: 25
|
|
| 08.10.2016, 16:01 | |
|
Catstail, спасибо! А как вы выводите результат? Я работаю в hugs98. Ввожу main > task 1 500 1, где k=1, p=1 - это начальные значения, n=500
Выводит ответ 500 Оставил рекурсивный способ
0
|
|
|
1 / 1 / 0
Регистрация: 06.10.2016
Сообщений: 25
|
|
| 08.10.2016, 16:23 | |
|
Проверил на примере task 5 1 1 - он выдал 56. Должно быть 28...
0
|
|
|
0 / 0 / 0
Регистрация: 25.02.2016
Сообщений: 11
|
|
| 08.10.2016, 17:56 [ТС] | |
|
Благодарю всех за помощь! Теперь есть хотя бы пример, буду разбираться, как это все работает ))
0
|
|
|
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
|
||||||
| 08.10.2016, 18:21 | ||||||
|
Будет намного быстрее, если число раскладывать на простые множители и уже на основе них считать количество делителей
1
|
||||||
| 08.10.2016, 18:47 | |||
|
0
|
|||
|
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
|
|||||||
| 08.10.2016, 19:31 | |||||||
|
Поэтому с простыми множителями работа будет не просто быстрее, а быстрее на порядки
3
|
|||||||
| 08.10.2016, 23:49 | |
|
vrm2, да, если во входящем потоке преобладают числа, раскладывающеся на множители, то такой алгоритм эффективнее, и чем больше в среднем множителей у элемента потока, тем более явно это проявляется.
ЗЫ попробовал того же лиспового кота на итеративном эвалюаторе - 4 минуты...
0
|
|
|
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
|
|||||||
| 09.10.2016, 11:26 | |||||||
4,8 сек (перебор делителей) против 0,15 сек. (подсчет делителей по простым множителям)
0
|
|||||||
| 09.10.2016, 22:16 | ||
|
0
|
||
| 09.10.2016, 22:16 | |
|
Помогаю со студенческими работами здесь
16
Найти натуральное число из интервала от a до b, у которого количество делителей максимально. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут
Суть:
- Группа наркоманов из 10 человек.
- Только один инфицирован ВИЧ.
- Колются одной иглой.
- Колются раз в день.
- Колются последовательно через. . .
|
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
|
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|
Настройки VS Code
Loafer 13.04.2026
{
"cmake. configureOnOpen": false,
"diffEditor. ignoreTrimWhitespace": true,
"editor. guides. bracketPairs": "active",
"extensions. ignoreRecommendations": true,
. . .
|
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2.
Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива.
Было так:. . .
|
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|