Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нахождение числа фибоначи 
V
    Опции темы
Rubio
Дата 23.8.2012, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 8.8.2012

Репутация: нет
Всего: нет



45 и 46 чичла находит правильно а вот 47 выдает -1323752223, это притом что тип беззнаковый, не могу понять почему так, тем более что это упражнение из книги и там нормально находит и 100 число.

Код
#include <iostream>
using namespace std;

int fib(int n);
int main()
{
    int p;
    cin >> p;

    cout << fib(p) << endl;
    system("pause");
    return 0;
}

int fib(int n)
{
    unsigned int  mOne = 1, mTwo = 1, ans = 2;

    if (n < 3)
        return 1;

    for (n -= 3; n; n--)
    {    
        mTwo = mOne;
        mOne = ans;
        ans = mOne + mTwo;
    
    }
    return ans;
}


Модератор: не забываем пользоваться кнопочкой "Код"
PM MAIL   Вверх
disputant
Дата 23.8.2012, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: нет
Всего: 3



1. Возвращаете-то вы int, о какой уж тут беззнаковости говорить...
2. + переполнение...
 
3. 100-е число Фибоначчи равно 354224848179261915075, а максимум 64-битного беззнакового - 18446744073709551615. Так что что-то не очень версится в просто так, без ухищрений вычисленное сотое число Фибоначчи...


Это сообщение отредактировал(а) disputant - 23.8.2012, 17:45
PM MAIL   Вверх
Rubio
Дата 23.8.2012, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 8.8.2012

Репутация: нет
Всего: нет



Цитата(disputant @ 23.8.2012,  17:39)
1. Возвращаете-то вы int, о какой уж тут беззнаковости говорить...
2. + переполнение...
 
3. 100-е число Фибоначчи равно 354224848179261915075, а максимум 64-битного беззнакового - 18446744073709551615. Так что что-то не очень версится в просто так, без ухищрений вычисленное сотое число Фибоначчи...


Спасибо за ответ, глупая ошибка, значит 100 число с unsigned int неправильно выдаст?
PM MAIL   Вверх
borisbn
Дата 23.8.2012, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



> значит 100 число с unsigned int неправильно выдаст? 

> 100-е число Фибоначчи равно 354224848179261915075
Ты бы лучше спросил disputant как он это посчитал  smile 
Вики не в счёт


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Фантом
Дата 23.8.2012, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 4
Всего: 49



Цитата(borisbn @  23.8.2012,  19:01 Найти цитируемый пост)
Ты бы лучше спросил disputant как он это посчитал

Ну так C++ - не единственный язык.  smile Если взять что-то с бесконечнозначной арифметикой и, по-возможности, функциональное, то это несложно. Вот, например, на Прологе
Код

fib(1,1,1).
fib(N,Z,R):-Nn is N-1,fib(Nn,R,Rr),Z is R+Rr.

fibo(N,Z):-fib(N,Z,_).

PM   Вверх
math64
Дата 24.8.2012, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Можно заменить int на double - для больших чисел результат будет хотя и приближённый, но правильный, отрицательных чисел не будет. Но при очень больших n тоже будет переполнение.
PM   Вверх
maxi2
Дата 20.10.2013, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 8.5.2012

Репутация: 1
Всего: 1



Ну а как найти числа фибоначчи на некотором интервале [m;n]. Это для меня несколько затруднительная задача. Ведь так надо сперва найти первый элемент фибоначчи. А как это сделать? То есть я так понимаю что надо использовать цикл for (i=M; i<N;i++) и если встречается первое число фибонач. надо запомнить его и выходит из цыкла но тогда такой алгоритм должен выглядять for(i=m; i<n; i++)  if (i=fibo(j)) {f1=i} break; так тогда еще надо цыкл и для j. Вообщем тогда выходит что и последний элемент фибон. из интервала тоже надо находит. То есть надо как то взаимосвязать i и j.
PM MAIL   Вверх
baldina
Дата 20.10.2013, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(maxi2 @  20.10.2013,  20:30 Найти цитируемый пост)
Ведь так надо сперва найти первый элемент фибоначчи

не надо. есть явная (не рекуррентная) формула (т.н. Формула Бине)
PM MAIL   Вверх
maxi2
Дата 22.10.2013, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 8.5.2012

Репутация: 1
Всего: 1



Ой не думаю что там аж такие формулы применяются. Тем более хотел бы увидеть формулу бине на примере алгоритма. В общем то проблема в том что например надо k-значные числа вывести. Например од милиона до 10 млн. Для чего тогда проходить цыкл от 0 до 1млн. Хотя если применять рекуренцию то она и так очень большые расчеты делает начиная с наименьшых ибо надо знать значение предыдущих. В моем задание стояла задача найти наиболее эфективный метод. А рекурсия это вряд ли. И еще цыкл до числа m. Знаю есть формула где как раз числа добавляются в сравнение с предыдущим уровнем. Но полюбому надо знать первое число в интервале и потом от него отталкиватся и уже потом проверять меньше ли следующи числа фибоначчи конца интервала. Хотя кончено интегви может быть и  17-19, и 173-284, и 10000-200000. Ну полюбому число m как то связано с предыдущим числом фибоначчи. Да и каждое такое число имеет свои номер в порядке этих чисел.   
PM MAIL   Вверх
baldina
Дата 23.10.2013, 00:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



а, так нужно не n-e число, а число из интервала... я не понял сразу

Цитата(maxi2 @  20.10.2013,  20:30 Найти цитируемый пост)
как то взаимосвязать i и j

просто последовательно рассчитывать, типа
Код

fib_0 = fib_1 = 1;
fib_n = fib_1;
while (fib_n < n) {
  fib_0 = fib_1;
  fib_1 = fib_n;
  fib_n = fib0+fib1;
}
// fib_n - минимальное число в интервале 
fib_m = fib_n;
while (fib_1 < m) {
  fib_0 = fib_m;
  fib_m = fib_1;
  fib_1 = fib0+fib_m;
}
// fib_m - максимальное число в интервале


Цитата(Rubio @  23.8.2012,  17:14 Найти цитируемый пост)
 47 выдает -1323752223

если надо считать числа не по порядковому номеру, а в указанном интервале, то переполнение не имеет значения: если числа, определяющие границы интервала, представимы в компьютере, то и при расчете переполнения не будет

Цитата(maxi2 @  22.10.2013,  20:33 Найти цитируемый пост)
найти наиболее эфективный метод

это алгоритм (логарифмической сложности) возведения матрицы 2x2 в степень. тут его смысла использовать нет, т.к. нужно не одно число, а последовательность

Это сообщение отредактировал(а) baldina - 23.10.2013, 00:04
PM MAIL   Вверх
feodorv
Дата 23.10.2013, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(baldina @  23.10.2013,  01:03 Найти цитируемый пост)
то переполнение не имеет значения

Может случиться так, что первое же число Фибоначчи после m вызовет переполнение, тогда цикл
Цитата(baldina @  23.10.2013,  01:03 Найти цитируемый пост)
while (fib_1 < m) {

пойдёт по-новой...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
baldina
Дата 23.10.2013, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(feodorv @  23.10.2013,  00:18 Найти цитируемый пост)
Может случиться так, что первое же число Фибоначчи после m вызовет переполнение

Может случиться и так, что первое же число Фибоначчи после n вызовет переполнение))))

Добавлено через 7 минут и 10 секунд
если заботиться о переполнении, можно применять проверку вида f0/2+f1/2 < m/2-2

PM MAIL   Вверх
Фантом
Дата 23.10.2013, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 4
Всего: 49



Цитата(baldina @  23.10.2013,  01:03 Найти цитируемый пост)
а, так нужно не n-e число, а число из интервала... я не понял сразу

Это не слишком сильно усложняет задачу. Из той же формулы Бине следует, что для подсчета n-ого числа Фибоначчи достаточно просто взять целую часть от f^n/sqrt(5), где f=(1+sqrt(5))/2. Соответственно, если есть нижняя граница интервала x, то номер первого числа, попадающего в интервал, считается как n=log(sqrt(5)*x)/log(f)+1. С верхней границей ситуация аналогична.
PM   Вверх
baldina
Дата 23.10.2013, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Фантом @  23.10.2013,  11:56 Найти цитируемый пост)
Это не слишком сильно усложняет задачу

это её меняет

Цитата(Фантом @  23.10.2013,  11:56 Найти цитируемый пост)
f^n
 довольно трудоёмко при большом n. даже используя эффективный метод O(logN) при расчете N чисел даст O(NlogN) против O(N) последовательного сложения

Добавлено через 4 минуты и 3 секунды
Цитата(Фантом @  23.10.2013,  11:56 Найти цитируемый пост)
если есть нижняя граница интервала x, то номер первого числа, попадающего в интервал, считается как n=log(sqrt(5)*x)/log(f)+

да, я тоже подумал об этом. использовать разные методы для нахождения первого числа в диапазоне и последующих ТС'у имхо сложновато
PM MAIL   Вверх
maxi2
Дата 23.10.2013, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 8.5.2012

Репутация: 1
Всего: 1



Такое условие на фирме мне задавали. Сперва интерва потом k значомкз число. Я так понял в последнем варианте от число от 1 и (k-1) нулей до 1 и k нулей. Но снова таки числом это трудно задать. Потому надо было парсить кажется toChаrArray проверять равно ли количество знаков числу k. Но цыкл фибоначчи начинался от i=0. Тогда наверное надо было применять цыкл while (i) в конце блока его увеличивать на 1 и если число фибоначчи было бы k+1 значное тогда выходить из цыкла. Через брейк. Ну то что я написал о взаимосвязи числа m и числа фибоначчи перед ним я имел ввиду что это число q должно быть как минимум не в два рады меньше m. Может есть какая то формула. Например для 10 это число 8, для  20-13, 100-79. Как и зависимость числа фибон. от порядкового номера i. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0592 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.