Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 14.01.2022
Сообщений: 19

Напечатать наибольшее число Фибоначчи, которое не больше заданного натурального числа N

15.01.2022, 15:42. Показов 2143. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Никогда не делал подобного, помогите пожалуйста!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.01.2022, 15:42
Ответы с готовыми решениями:

Найти такое число Фибоначчи, которое больше заданного числа Z
Вычисление каждого числа Фибоначчи оформить в виде процедуры

Найти такое число Фибоначчи, которое больше заданного числа Z
Найти такое число Фибоначчи, которое больше заданного числа Z. Вычисление каждого числа Фибоначчи оформить в виде процедуры. ...

Найдите наибольшее натуральное p,не больше заданного натурального числа n,такое,что p^2+1 - простое
Помогите решить пожалуйста: Найдите наибольшее натуральное p,не больше заданного натурального числа n,такое,что p^2+1 - простое

18
0 / 0 / 0
Регистрация: 14.01.2022
Сообщений: 19
15.01.2022, 15:58  [ТС]
Помогите написать код раньше никогда не затрагивал число Фибоначчи! Спасибо за помощь заранее!
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6115 / 2810 / 1038
Регистрация: 01.06.2021
Сообщений: 10,245
15.01.2022, 16:26
Лучший ответ Сообщение было отмечено Noob_prooger как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
 
int fib(int);
 
int main()
{
    cout << "N = ";
    int n; cin >> n;
    int i = 0;
    while (true)
    {
        if (fib(i+1) <= n) ++i;
        else break;
    };
    cout << "F[" << i << "] = " << fib(i);
}
 
int fib(int n)
{
    if (n == 0)
        return 0;
    if (n == 1)
        return 1;
    return fib(n-1) + fib(n-2);
}
2
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6115 / 2810 / 1038
Регистрация: 01.06.2021
Сообщений: 10,245
15.01.2022, 16:31
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
 
int fib(int);
 
int main()
{
    cout << "N = ";
    int n; cin >> n;
    int i = 0;
    while (true)
    {
        if (fib(i+1) <= n) ++i;
        else break;
    };
    cout << "F[" << i << "] = " << fib(i);
}
 
int fib(int n)
{
    if (n == 0)
        return 0;
    if (n == 1)
        return 1;
    return fib(n-1) + fib(n-2);
}
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
15.01.2022, 16:35
Может быть тут уместно воспользоваться формулой Бине?
https://ru.wikipedia.org/wiki/... рмула_Бине

Добавлено через 3 минуты
К тому же рекурсивно считать числа фибаначчи для КАЖДОГО члена ну очень не эффективно!
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6115 / 2810 / 1038
Регистрация: 01.06.2021
Сообщений: 10,245
15.01.2022, 16:37
Байт, а для формулы Бине будет много операций по возведению в степень, там тоже не все ок
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
15.01.2022, 16:40
Цитата Сообщение от Royal_X Посмотреть сообщение
для формулы Бине будет много операций по возведению в степень
Но можно просто решить логорифмеческое неравенство - и все дела!
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6115 / 2810 / 1038
Регистрация: 01.06.2021
Сообщений: 10,245
15.01.2022, 16:46
Байт, этот матричный метод лучше, чем Бине
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,680
Записей в блоге: 14
15.01.2022, 18:42
C++
1
2
3
4
5
6
7
8
9
10
11
int fib(int n)
{
    int c=0,p=1,q;
    for (int i=1; i<=n; i++)
    {
          q=c+p;
          p=c;
          c=q;
    }
    return c;
}
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
15.01.2022, 20:41
Catstail, Все равно как-то нелепо считать каждое число фибоначчи с самого начала. Надо бы их генерить потихонечку, пока не найдется нужное. Типа того:
C++
1
2
3
4
5
6
7
8
int c=0, p=1;
while(p <=N)
  int q = c+p;
  p = c;
  c = q;
}
if (p==N) cout <<p;
else cout << c;
Мог с и р перепутать, но идея, кажется ясна.

Добавлено через 5 минут
Цитата Сообщение от Royal_X Посмотреть сообщение
этот матричный метод лучше, чем Бине
Это такой же последовательный алгоритм, просто записан покрасивше (матрично). Бине же позволяет найти число за одно действе

Добавлено через 12 минут
Достаточно найти целую часть от числа (или округлить до целого)
https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{lnN\sqrt{5}}{ln(1+\sqrt{5}) -ln2}
Вторым членом формулы Бине можно пренебречь уже для небольших членов ряда
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6115 / 2810 / 1038
Регистрация: 01.06.2021
Сообщений: 10,245
15.01.2022, 21:18
Байт, но для формулы Бине придется использовать FPU. Да и непонятно, что за странные числа выдает ваша формула. Например, мой код для N=45 выводит ответ 34, да еще показывает, какое по счету это число Фибоначчи:
C++
1
2
N = 45
F[9] = 34
Теперь считаю https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{\ln (45)\cdot\sqrt{5} }{\ln \left(\sqrt{5}+1\right)-\ln (2)}

получаю ≈ 17,6886. Ну и как это округлять, чтобы 34 получить?

А вообще, полагаю, что можно использовать мемоизацию.

Цитата Сообщение от Байт Посмотреть сообщение
Все равно как-то нелепо считать каждое число фибоначчи с самого начала
Да не придется делать много вычислений, ведь 47-е число Фибоначчи уже больше, чем INT_MAX.

Можно вообще записать первые 94 чисел Фибоначчи в массив, а дальше ничего и не вычислять, ведь 95-е число Фибоначчи больше, чем ULLONG_MAX (18446744073709551615).
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,680
Записей в блоге: 14
16.01.2022, 08:07
Байт, да я не решал эту (уже много раз решенную) задачу. Я просто привел линейный алгоритм, получения чисел Фибоначчи (без убийственной древовидной рекурсии).
1
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,266
16.01.2022, 11:37
Цитата Сообщение от Байт Посмотреть сообщение
Все равно как-то нелепо считать каждое число фибоначчи с самого начала. Надо бы их генерить потихонечку, пока не найдется нужное. Типа того:
Найдите 10 отличий:

Catstail
C
1
2
3
4
5
6
7
    int c=0,p=1,q;
    for (int i=1; i<=n; i++)
    {
          q=c+p;
          p=c;
          c=q;
    }
Байт
C
1
2
3
4
5
6
7
int c=0, p=1;
while(p <=N)
{
  int q = c+p;
  p = c;
  c = q;
}
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
16.01.2022, 18:00
Цитата Сообщение от alexu_007 Посмотреть сообщение
Найдите 10 отличий:
Отличие только одно
Цитата Сообщение от alexu_007 Посмотреть сообщение
while(p <=N)
Что позволяет не генерировать каждое число с начала, а сразу выходить на нужное
Не видите разницы? Ну и не надо!

Добавлено через 6 минут
Цитата Сообщение от Catstail Посмотреть сообщение
да я не решал эту
Прошу прощения.
И спасибо за ссылочку! В общем-то вещи вполне известные, но почитать было приятно

Добавлено через 6 минут
Royal_X, Корень из 5 под логарифмом - ln(45sqrt(5)).
И округлять надо в меньшую сторону.
И дает формула номер числа Фибоначчи Но по номеру по той же формуле (Бине) не трудно найти и само число
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6115 / 2810 / 1038
Регистрация: 01.06.2021
Сообщений: 10,245
16.01.2022, 20:57
Цитата Сообщение от Байт Посмотреть сообщение
Корень из 5 под логарифмом - ln(45sqrt(5)).
И округлять надо в меньшую сторону.
так другое дело, но по вашей формуле это было невозможно понять

Не вижу смысла продолжать эту тему. ТС нужен простой код, я ему написал такой. Хотите оптимизации, как в проектах НАСА? Вот самый быстрый алгоритм!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
using namespace std;
 
int main()
{
    const unsigned long long fib[94] = 
    {
        0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987,
        1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393,
        196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887,
        9227465, 14930352, 24157817, 39088169, 63245986, 102334155,
        165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903,
        2971215073, 4807526976, 7778742049, 12586269025, 20365011074,
        32951280099, 53316291173, 86267571272, 139583862445, 225851433717,
        365435296162, 591286729879, 956722026041, 1548008755920,
        2504730781961, 4052739537881, 6557470319842, 10610209857723,
        17167680177565, 27777890035288, 44945570212853, 72723460248141,
        117669030460994, 190392490709135, 308061521170129, 498454011879264,
        806515533049393, 1304969544928657, 2111485077978050,
        3416454622906707, 5527939700884757, 8944394323791464,
        14472334024676221, 23416728348467685, 37889062373143906,
        61305790721611591, 99194853094755497, 160500643816367088,
        259695496911122585, 420196140727489673, 679891637638612258,
        1100087778366101931, 1779979416004714189, 2880067194370816120,
        4660046610375530309, 7540113804746346429, 12200160415121876738
    };
    cout << "N = ";
    unsigned long long n; cin >> n;
    for (int i = 0; i < 94; ++i)
        if (fib[i] > n)
        {
            cout << "F[" << i-1 << "] = " << fib[i-1];
            break;
        }
}
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
17.01.2022, 17:27
Royal_X, ну окей, не факт, что формула Бине эффективна, целые числа лучше, но рекурсию-то использовать зачем???
Ты ж в неё в эн-квадрат что-ли раз закапываешься из-за двух рекурсивных вызовов вместо одного!
Catstail показал как лучше решать!
1
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
17.01.2022, 19:20
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
int main(){
    int x = 1;
    int y = 0;
    int n,t;
    
    cin >> n;
    while (y < n){
        t = y;
        y = x + y;
        x = y - x;
    } 
    cout << t;
    return 0;
}
алгоритм из олимпиадной задачи измененный под данные условия
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6115 / 2810 / 1038
Регистрация: 01.06.2021
Сообщений: 10,245
17.01.2022, 21:08
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
но рекурсию-то использовать зачем???
Ты ж в неё в эн-квадрат что-ли раз закапываешься из-за двух рекурсивных вызовов вместо одного!
В рекурсивной функции временная сложность точно не https://www.cyberforum.ru/cgi-bin/latex.cgi?O({n}^{2}), а приблизительно https://www.cyberforum.ru/cgi-bin/latex.cgi?O({2}^{n}), а если быть точнее, то https://www.cyberforum.ru/cgi-bin/latex.cgi?O({\varphi }^{n}). Т.е. дела обстоят гораздо хуже, чем вы предполагали
Тем не менее, предложенный мной код рекурсивного фибоначчи очень прост в понимании, что важно, учитывая что ТС придётся объяснить код своему преподу.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Catstail показал как лучше решать!
Согласен, я в этом даже и не сомневаюсь. Если даже просто написать в поисковике "fastest fibonacci algorithm c++", то обязательно можно наткнуться на предложенный Catstail код. Тут вне всяких сомнений хороший код. Но самым быстрым все равно будет код в посте № 15.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
17.01.2022, 23:08
Цитата Сообщение от Royal_X Посмотреть сообщение
Но самым быстрым все равно будет код в посте № 15.
Увы! Его ьже можно здорово улучшить. Не O(n), а O(ln n)
Про метод половинного деления слышали?
Цитата Сообщение от Royal_X Посмотреть сообщение
Не вижу смысла продолжать эту тему. ТС нужен простой код, я ему написал такой.
Если исходить из нужд из ТС, то наверное, он вполне удовлетворен
Но неужели вам самому не интересны какие-то новые подходы, методы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.01.2022, 23:08
Помогаю со студенческими работами здесь

Найти первое число Фибоначчи, большее заданного натурального числа
Найти первое число Фибоначчи, больше N, где N - заданное натуральное число, большее 1. И создать блок схему.

Составить из заданного числа наибольшее число, которое делится на 3.
Дано натуральное число, содержащее до 50 разрядов. Составить из этого числа наибольшее число, которое делится на 3. Если такое число...

Составить из заданного числа наибольшее число, которое делится на 10
Дано натуральное число, содержащее до 50 разрядов. Составить из этого числа наибольшее число, которое делится на 10. Если такое число...

Найдите наибольшее натуральное число, которое не может быть равно сумме цифр натурального числа, делящегося на 17
Найдите наибольшее натуральное число k, которое не может быть равно сумме цифр натурального числа, делящегося на 17.

На каком месте в ряду будет стоять число Фибоначчи, которое меньше заданного числа Z
На каком месте в ряду будет стоять число Фибоначчи, которое меньше заданного числа Z. Вычисление каждого члена Фибоначчи оформить в виде...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru