![]() |
Модераторы: Poseidon |
![]() ![]() ![]() |
|
Merhaba |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 23.4.2011 Репутация: нет Всего: нет |
Добрый Вечер!!!
Помогите Пожалуйста написать код, который будет очень быстро вычислять числа фибоначчи с номерами от 3 до 50000 . Первый элемент последовательности - 1; Второй элемент последовательности - 1; Я пытался написать программу через рекурентную формулу, но вычисляет очень долго:
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: нет Всего: 250 |
вот на C++
|
|||
|
||||
Merhaba |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 23.4.2011 Репутация: нет Всего: нет |
mes,
а как можно написать код, чтобы вычисляло очень быстро? |
|||
|
||||
Silent |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 252 Регистрация: 3.10.2006 Репутация: 6 Всего: 9 |
Держи, но я не проверял на правильность, хотя должно все работать:
Но данный код оставляет желать лучшего - 50000 сложений-остатков. Есть алгоритм ПОБЫСТРЕЕ! Писать код, Merhaba, я за тебя не буду (если ты, конечно, лапки кверху не поднимешь), но дам пару подсказок: 1) числа фиббоначчи лучше вычислять так: http://algolist.manual.ru/maths/count_fast/fibonacci.php, через матричные операции. 2) а возведение в степень (для пункта 1) лучше делать так: http://algolist.manual.ru/maths/count_fast/fast_exp.php Сколько тебе дать времени на размышления-написания? Или мне сразу шустрый код привести? ![]() Это сообщение отредактировал(а) Silent - 20.5.2011, 22:03 |
|||
|
||||
Merhaba |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 23.4.2011 Репутация: нет Всего: нет |
Silent,
Приведите Пожалуйста сразу шустрый код) А то я серъёзно лапки кверху подниму |
|||
|
||||
Silent |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 252 Регистрация: 3.10.2006 Репутация: 6 Всего: 9 |
Что ж Вы так быстро сдались
![]() поскольку с Java я не на короткой ноге, то приведу код на C# (VS2010) - отличия крайне незначительны Версия v0, приводилась мной в предыдущем сообщении, и содержала ошибку (теперь все правильно):
Данный код является линейным и требует O(N) операций. Для 50000 можно использовать и его - на моей машине вычисления выполнялись за 32мс. Вторая версия v1, использующая матричную алгебру реккурентных формул, и быстрое возведение в степень:
Для 50000 я также не заметил никакой задержки выполнения (те же 32мс), но для бОльших значений разница будет, как говорится, на лицо. Особенно это будет заметно, если необходимо посчитать не по модулю. Количество операций - O(logN). (Если не разберешься с переводом C#->Java, придется-таки мне скачивать и ставить что-нить для java-кода) |
||||
|
|||||
Merhaba |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 23.4.2011 Репутация: нет Всего: нет |
Silent,
Если Вас не затруднит, помогите Пожалуйста перевести вот этот код на Java.
|
|||
|
||||
Merhaba |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 23.4.2011 Репутация: нет Всего: нет |
Silent,
Объясните Пожалуйста первый способ и почему там int tmp = (a + b) % pow; за что отвечает l ? Это сообщение отредактировал(а) Merhaba - 21.5.2011, 22:58 |
|||
|
||||
Silent |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 252 Регистрация: 3.10.2006 Репутация: 6 Всего: 9 |
я не знаю как это будет на Java, но суть кода - програма получает на вход консоли строку, которую разбирает на три токена (вход - три параметра, n, k, l), которые преобразуются из строки в число. Гугль мне подсказывает, что данный код перепишется так:
остальное вроде точно так же что в C#, что в Java Просите пояснение про первый способ... не знаю как объяснить, я не математик, но остаток от суммы можно считать вот таким образом, посмотрите, пожалуйста, теорию чисел, в сторону модулярной арифметики. |
||||
|
|||||
Merhaba |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 23.4.2011 Репутация: нет Всего: нет |
Silent,
Если Вас не затруднит, объясните Пожалуйста вот эту строчку: int tmp = (a + b) % pow; почему там a+b ? |
|||
|
||||
m1st |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 1.11.2006 Репутация: нет Всего: нет |
Решение этого задания есть тут: Задачи на числа. Решение. Покритикуйте. (часть №1)
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Центр помощи" | |
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Центр помощи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |