Требуется найти последнюю цифру n-го числа Фибоначчи. Оптимизация алгоритма
Согласно таблице на странице http://acmp.ru/index.asp?main=bstatus&id_t=623&lang=CPP за счет небольшого увеличения расхода памяти как то умудряются вложиться в 1-2 секунды. С одной стороны может быть мне подсунули входное число 1000, а другим 10.
Есть идеи по повышению производительности?
![]()
Очевидные простые улучшения:
- Можно заменить взятие остатка на сравнение с 10 и вычитание 10 (т. к. результат гарантированно меньше 20). По идее, операция деления более тяжёлая.
- Можно подсчитать lookup-таблицу (a, b) -> c , она по идее небольшая. Но вряд ли двойной lookup будет существенно быстрее пары сложений/вычитаний.
- Алгоритмическое улучшение: поскольку следующий член последовательности зависит лишь от двух предыдущих, то последовательность обязательно зациклится. Причём поскольку всего пар цифр не более 100, длина цикла не более 100. Найдите заранее длину цикла (отдельной программой), теперь число n можно брать по модулю длины цикла.
- Комбинируя 2 и 3, можно подсчитать заранее ответы для n от 0 до 99, и согласно 3 этого достаточно. Итого решение за O(1).
![]()
Период чисел Фибоначчи по модулю натурального числа n называется периодом Пизано и обозначается π(n). Периоды Пизано π(n) образуют последовательность: 1, 3, 8, 6, 20, 24, 16, 12, 24, 60, 10, 24, 28, 48, 40, 24, 36, … (последовательность A001175 в OEIS)
В частности, последние цифры чисел Фибоначчи образуют периодическую последовательность с периодом π(10)=60, последняя пара цифр чисел Фибоначчи образует последовательность с периодом π(100)=300, последние три цифры — с периодом π(1000)=1500, последние четыре — с периодом π(10000)=15000, последние пять — с периодом π(100000)=150000 и т. д.
Что такое период Пизано понятно из таблицы для π(4):
То есть π(4) = 6, а именно: остатки от деления чисел Фибоначчи на 4 повторяются с периодом 6.
Как это применить для решения задачи подумайте сами.
![]()
В степень бинарным возведением, беря ее элементы по модулю 10, можно решать эту задачу за O(logN).
Даже можно не ограничиваться модулем 10.
Тут выше уже написали, но самой лучшей оптимизацией будет именно использование матрицы, а точнее возведение ее в степень того номера, который ищите. Про реализацию можете ознакомиться на хабре, там на питоне все очень понятно. С теоретическим обоснованием можете ознакомиться в книге Д.Кнута, где, собственно, впервые и приводится объяснение эффективности решения
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.8.2.43556
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как вывести последнюю цифру числа в c
Выделение в цикле цифр в числе от младших разрядов к старшим

Сегодня мы узнаем с вами, как отделить каждую цифру от числа начиная от младшего разряда, заканчивая старшим. Это нам частенько пригодится в дальнейшем.
Разделение числа на цифры
Идея алгоритма:
Для каждого числа необходимо найти его разряд.
- 1 => единица;
- 42 => 4 десятка и 2 единицы;
- 829 => 8 сотен, 2 десятка, 9 единиц.
Поиск разрядов числа
Нам дано число: 123456789
Последнюю цифру мы легко найдем, нам достаточно наше число разделить 10 с остатком. А что делать с предпоследней цифрой? Тут как минимум есть два варианта:
- /10 – откинули последнюю цифру, а затем снова %10;
- %10 и его степень. Способ довольно неудобный. Поэтому мы не будем им пользоваться.
Первый вариант кажется достаточно удобным. Мы будем получать нужную нам цифру в ходе каждой итерации цикла.
- 123456789 % 10 = 9;
- 123456789 / 10 = 12345678;
- Переходим к следующей итерации
- 12345678 % 10 = 8;
- 12345678 / 10 = 1234567;
И так далее пока не переберем все число.
Алгоритм разделения числа на цифры

- Ввести число a;
- Запустить цикл;
- Найти цифру при помощи a % 10;
- Вывести цифру (или использовать ее в задаче);
- Уменьшить а в 10 раз.
Этот цикл будет работать до тех пор, пока n не превратится в 0.
Стоит запомнить, что в данном случае цифры выводятся в обратном порядке.
Использование алгоритма
Мы можем применять данный алгоритм в этих случаях
- Анализ зависимостей в цифрах числа;
- Определение присутствия цифры;
- Подсчёт цифр;
- Подсчёт количества цифр;
- Замена цифр в числе;
- Анализ чисел в других системах счисления;
- Анализ бинарных данных.
Решение задач
Разбор задачи Счастливый билет

Например, мы хотим написать программу, которая проанализирует билет, который нам дали в автобусе, является он счастливым или нет? Если вы не помните или не знали, как это делается, напомню. Билет считается счастливым, когда сумма первых трех чисел равняется сумме трех последних.
Нам вводится номер билета и необходимо проверить, является ли он счастливым.
Давайте посчитаем. Посмотрите на номер нашего билета: 306 450.
- Если мы просуммируем 3+0+6 == 4+5+0;
- То получим в первой и второй сумме чисел одинаковое значение 9 == 9;
- Это означает, что наш билет счастливый.
Все элементарно, но теперь встает вопрос, как же нам разбить наше число на отдельные цифры? А мы уже знаем, как это сделать.
Алгоритм решения
- Ввести число;
- Разделять его на цифры;
- Первые три числа добавлять в sum1;
- Последние три числа добавлять в sum2;
- Сравнить sum1 и sum2.

Разложи на цифры
Дано восьмизначное число, необходимо написать в строку каждую цифру данного числа через пробел, начиная с разряда единиц.
Формат входных данных
Дано целое число N (10 000 000 Tags
циклы — C ++ Удалить первую и последнюю цифры числа
Я пытаюсь написать программу, чтобы избавиться от первой и последней цифры числа. Для последней цифры, погружение int на 10 решает эту проблему. Мне нужно найти способ использовать% для удаления первой цифры, но кажется, что моя логика где-то выключена, моя программа работает, но она не работает правильно. Видите какие-либо ошибки в логике?
Решение
Еще одно аналогичное целочисленное арифметическое решение:
Другие решения
Есть несколько проблем, но ключевой, возможно, такой:
^ побитовый xor , это не энергетический оператор.
Вместо этого вы можете попробовать что-то вроде этого:
Постскриптум Существуют более короткие и быстрые алгоритмы, но я постарался сохранить логику данного.
Как вывести последнюю цифру числа в c
unget потока istream возвращает только последнюю цифру числа
Функция unget() возвращает только последний считанный символ.
Более того, стандарт гарантирует возврат только одного символа. Т.е. если вы вызовите unget() десять раз — нет никакой уверенности, что в поток будут возвращено более 1 символа.
Как сказано в «Стандартной библиотеку С++» Джосаттиса, «Стандарт гарантирует правильность работы только одного вызова между двумя операциями чтения».
![]()
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.11.43304
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
5175. Последняя цифра
Вход. Одно натуральное число n (1 ≤ n ≤ 10 9 ).
Выход. Выведите последнюю цифру числа n.
Пример входа 1
Пример выхода 1
Пример входа 2
Пример выхода 2
РЕШЕНИЕ
элементарная задача
Анализ алгоритма
Последняя цифра натурального числа n равна n % 10.
Реализация алгоритма
Читаем натуральное число n и выводим его последнюю цифру n % 10.
Подскажите как найти первую (последнюю) цифру числа (с++)
число целое, не указано это двух цифровое, трех цифровое или пяти цифровое.. . так что деление и остатки не прокатят.
Вадим, мне потом их суммировать нужно, не прокатит

прокатит и деление и остатки: http://ideone.com/Nd7wMc
Преобразуйте в char* возьмите первый и последний байт, преобразуйте обратно в цифры.
1. Преобразовать число в строку (IntToStr)
2. Узнать количество символов в строке (length)
3. Взять первый и последний символ (str[])
4. Преобразовать обратно в число (StrToInt)

число % 10 вернёт остаток от деления на десять. конкретно — последняя цифра.
а первую цифру — в цикле ищи.
число >=10. число = (int) число/10;
в результате в числе будет только старший разряд числа
int funct(int number)
=10)
number=number/10
digit2=number;
return digit1+digit2;
>
ёбанный движёк мэйла
Ошибка сервера в приложении ‘/’.
Описание: На сервере возникла ошибка приложения. Текущая пользовательская настройка ошибок для этого приложения не позволяет удаленно просматривать сведения об ошибке данного приложения (из соображений безопасности). Однако, сведения можно просматривать в браузерах, запущенных на локальном сервере.
Сведения: Для разрешения просмотра сведений данного сообщения об ошибке на локальном сервере создайте тег <customErrors> в файле конфигурации "web.config", который находится в корневом каталоге текущего веб-приложения. В теге <customErrors> следует задать атрибут "mode" со значением "Off".
Примечания: Отображаемую в данный момент страницу ошибок можно заменить на пользовательскую страницу ошибок, изменив атрибут "defaultRedirect" тега конфигурации <customErrors> приложения таким образом, чтобы он содержал URL-адрес пользовательской страницы ошибок.