|
1 / 1 / 0
Регистрация: 11.09.2021
Сообщений: 118
|
||||||
Вывести последнюю ненулевую цифру факториала13.12.2021, 12:51. Показов 8095. Ответов 30
Метки нет (Все метки)
Алгоритм работает неправильно на числах 15, 25 и т.д. В остальном всё нормально
0
|
||||||
| 13.12.2021, 12:51 | |
|
Ответы с готовыми решениями:
30
Нахождение факториала: для заданного N найти последнюю отличную от нуля цифру
Определить и вывести первую и последнюю цифру числа |
| 01.03.2024, 12:15 | |
|
0
|
|
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|
| 01.03.2024, 13:03 | |
|
Только что ж тема была
Добавлено через 28 секунд Нахождение факториала: для заданного N найти последнюю отличную от нуля цифру Один ВУЗ?
0
|
|
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
|||||||||||||||||
| 02.03.2024, 02:41 | |||||||||||||||||
0 в конце. После этого нам понадобится не последняя, а предпоследняя цифра результата. А вот именно ее мы к этому моменту уже потеряли. Однако чисто из любопытства возникает вопрос: а что если мы будем хранить не только последнюю ненулевую цифру факториала, а несколько последних ненулевых цифр? Например, для хранения двух последних цифр факториала реализацию ТС можно модифицировать так
Понятно, что сколько бы цифр бы мы ни хранили, в какой-то момент возникнет ситуация, когда после очередного умножения окажется, что все цифры обнулились и нам нужна следующая старшая цифра, которую мы не можем определить корректно. То есть такая реализация обязательно рано или поздно даст сбой (для какого-то числа n, содержащего фактор "5 в какой-то степени"). Но чем больше ненулевых цифр факториала мы будем сохранять, тем для больших значений n такая реализация сможет давать правильный ответ. Вот мне было интересно, как далеко можно зайти для разных делителей 10k в строке 8. Понятно, что использовать делитель больше 1010 или 1011 смысла нет - будет переполняться умножение в строке 6. Результаты моего натурного эксперимента таковы:
--- Хотя ясно, что натурный эксперимент можно было и не проводить. Количество двоек в факториале растет намного быстрее, чем количество пятерок. Поэтому для больших n можно ожидать, что если делитель в строке 8 равен 10k, то как только n станет равно 5k, то произойдет то самое обнуление всех хранимых нами последних цифр факториала и вычисления "сломаются". Это мы и видим в моих результатах сверху. Отсюда можно предположить, если я ничего не упускаю, что для того, чтобы такой полулобовой/наивный подход сработал для всего диапазона 32-битного unsigned int, нам нужно хранить 13-14 последних ненулевых цифр факториала (513 меньше 232, а 514 - больше). При этом во избежание переполнения в строке 6 нам понадобится 128-битное умножение.Для GCC с его __uint128_t
2
|
|||||||||||||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
||||||
| 03.03.2024, 02:26 | ||||||
|
Дождался
0
|
||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
|||||||
| 22.03.2024, 02:52 | |||||||
std::countr_zero (С++20). Вместо циклического умножения на 2 - простая зависимость последней цифры степени двойки от показателя степени:
0
|
|||||||
| 22.03.2024, 09:38 | |
|
Не по теме: zayats80888, YMMD
0
|
|
|
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
|
||
| 22.03.2024, 13:01 | ||
|
11*12*13*14*15=360360 и 16*17=272. Мы расчитали произведения где последний множитель кратный 5 и произведение где последний множитель не кратен 5. Берем последние цифры результата произведений отличные от нуля и считаем 2*4*6*2=96. проверяем по таблице факториалов 17!=355687428096000355687428096000 что нам и требовалось получить. Алгоритм до 100! работает правильно дальше не проверял.
0
|
||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
||||||||
| 22.03.2024, 19:01 | ||||||||
|
Во-первых, правильный подход к решению задачи уже приведен _Ivana в сообщении #13. Я привел существенно более эффективную реализацию этого подхода в #25. Цель моего сообщения #23, на которое вы отвечали - это не какие-то "необходимости", а лишь разобрать ошибку исходного "наивного" подхода ТС и то, как его можно попытаться "спасти". Во-вторых, касательно только что предложенного вами варианта. Напомню, что главная проблема, из-за которой эту задача не может быт решена "в лоб" - это разрушение результата из-за арифметических переполнений. Каким образом вы в вашем варианте предлагаете "рассчитывать произведения где последний множитель кратный 5" тогда, когда сомножители станут большими? Как вы предлагаете бороться с переполнением при вычислении произведения пяти последовательных больших чисел? Разумеется, правильно вычислить последнюю цифру такого произведения пяти можно, но сделать это, наверное, лучше всего именно тем же самым подходом, что и в сообщении #13. И в конечном итоге получится то же самое. То есть я не понимаю, что именно вы пытаетесь предложить. Как я уже сказал в сообщении #23, до 100! (точнее, до 374!) отработает вот такая простенькая бесхитростная реализация
0
|
||||||||
|
27 / 24 / 4
Регистрация: 20.11.2023
Сообщений: 131
|
||||||
| 22.03.2024, 19:13 | ||||||
0
|
||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
|
| 22.03.2024, 19:18 | |
|
0
|
|
|
27 / 24 / 4
Регистрация: 20.11.2023
Сообщений: 131
|
|
| 22.03.2024, 19:23 | |
|
TheCalligrapher, кривой алгоритм + переполнение. Модераторы, удалите мое "решение"
0
|
|
| 22.03.2024, 19:23 | |
|
Как вывести на экран последнюю цифру натурального числа в среде Dev C++? Суммировать первую и последнюю цифру каждого числа и вывести сумму получившихся чисел
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
|
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал.
Оно само - говорит.
Кто слышит тот слышит.
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|