Модераторы: 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   Вверх
baldina
Дата 23.10.2013, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(maxi2 @  23.10.2013,  14:22 Найти цитируемый пост)
Я так понял в последнем варианте от число от 1 и (k-1) нулей до 1 и k нулей

я так ничего не понял 

Цитата(maxi2 @  23.10.2013,  14:22 Найти цитируемый пост)
Потому надо было парсить кажется toChаrArray проверять равно ли количество знаков числу k

 smile

Добавлено @ 14:33
число знаков n в записи неотрицательного числа x по основанию b определяется несложной процедурой
Код

n=0
do {
  x /= b;
  ++n;
} while (x != 0);


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


Шустрый
*


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

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



Что вы имеете ввиду под основанием? 10. Да если х делить  на 10 так оно никогда не будет 0. Как и на другое иное. Может в коле цыкла должно быть: КОГДА (х>b). Например 1734 =173.4=17.34=1.734-от так действительно просто. И еще код приведу: public class K { int fibo(int f) { if (f=0) return 0; else if (f=1) return fibo (f-1)+fibo(f-2);} System.out.print(fibo(3));}-вот наткнулся на кое недельной давности. Извиняюсь что не по строкам. Нету ПК под руками. Но вот в строки где метод систем ошибки аж 5:identifier expected; ; expected возле числа 3. Illegal start of type возле первой закрывающийся скобки. Вобщем все ошибки возле (fibo(3))  
PM MAIL   Вверх
baldina
Дата 23.10.2013, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(maxi2 @  23.10.2013,  14:46 Найти цитируемый пост)
Да если х делить  на 10 так оно никогда не будет 0. Как и на другое иное

неужто  smile

Добавлено через 15 секунд
поделите 5 яблок на 10 человек

Добавлено через 5 минут и 16 секунд
зы. я виноват. надо было добавить, что х целочисленная (мне казалось это очевидным). для нецелых все похоже, только конечно число знаков надо ограничить
PM MAIL   Вверх
maxi2
Дата 26.10.2013, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Как говорил дедушка один, ученье свет иное тьма. Потому хотел бы знать подход знатоков к такой задаче. Вот есть к-значимое число. Надо найти числа фибон. кпторые имеют или все парные или только первую четную цыфру. Здесь без разложение числа на масив симболов не обойтись. Тем более к-значное число в цыкле не задаш напрямую. Хотя какой то цыкл надо использовать. Или ФО. Или ВАЙЛ. Хотел бы знать ваш подход. Ибо такое задание действительно озадачило.
PM MAIL   Вверх
baldina
Дата 26.10.2013, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



знатоки спят уже, потому я отвечу

Цитата(maxi2 @  26.10.2013,  00:39 Найти цитируемый пост)
без разложение числа на масив симболов не обойтись

любую численную задачу можно решить без "разложения на массив символов": символьная запись числа это лишь один из вариантов кодирования числа. это кодирование заключается в получении некоторых чисел и преобразования их в символы (цифры). ясно, что для решения достаточно значений цифр, их символьные коды не важны (и могут быть разными в разных кодировках)

Цитата(maxi2 @  26.10.2013,  00:39 Найти цитируемый пост)
Хотел бы знать ваш подход

вы задачу-то изложите.

Цитата(maxi2 @  26.10.2013,  00:39 Найти цитируемый пост)
есть к-значимое число

т.е. k-значное? в какой системе счисления?

Цитата(maxi2 @  26.10.2013,  00:39 Найти цитируемый пост)
Надо найти числа фибон. кпторые имеют или все парные или только первую четную цыфру

супер. а "к-значимое число" причем тут?

давайте я протелепатирую. задача такая: 
Дано целое число (это число может быть числом Фибоначчи или полученным иным путем, не важно).
Требуется: определить, является его первая цифра в десятичной записи четной или нечетной
Решение: 
Код

bool is_first_odd (int x) {
  bool odd;
  do {
     odd = x%2;
     x /= 10;
  } while (x != 0);
  return odd;
}

как видите, никакого предварительного превращения в строки, символы и т.п. не потребовалось. решения других подобных задач получаются аналогично.
PM MAIL   Вверх
maxi2
Дата 26.10.2013, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здесь я синтезировал две задачи. K-значное число это для того чтобы обозначить интервал. То есть надо вывести все k-зн. числа в которых первая или все цыфры четные/нечетные. Может ваш метод о деление на 10 и подходит. Хотя я не настолько опытный. Но разве разложение числа в масив символов (превращение в строку кажется ничего не даст) не подходит под решение задачи. Тогда надо каждую цыфру превращать в int и проверять не делится ли она на 2. Кажется задача поставлена. Хотя снова. Второй вопрос эфективности: надо как то определить этот интервал что бы не идти от 0 к нему вхолостую?/ Кстати вы код привели: вы сперва проверяете делится ли число на два. Но это надо проверять делится ли первая цифра на 2. То есть эту цыфру надо как то отделить. А если все цифры проверять. Ну хорошо поделили вы например 177 на 2. Выходит 88. И остача 1. Но если будет 176 то остачи не будет. Тогда что первая цифра изменилась как была 1 так и осталась. Зачем на 18 делить . Код точно не помню. А система-10ричная.
PM MAIL   Вверх
maxi2
Дата 26.10.2013, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну что вам слабо написать часть кода хотя бы для обозначание интервала или этих к-значных чисел фибоначчи? Сегодня знатоки еще не должны спать.
PM MAIL   Вверх
maxi2
Дата 25.2.2014, 03:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



От у меня снова вопрос по поводу поиска
на неком интервале [m;n] чисел фибоначчи где одна из цыфр есть нечетной (первая или последняя). То есть основная идея надо найти первое число в интервале.
int t;
while (t) {
                 int  k=fibo(t);
                  if (k>=m AND k=<n) {int j=k;
                                                   while(k) {if (k%2=1) break;
                                                                  int g=k%10;
                                                                  k=g;}
                                                    if(k=0)   {
                                                                  System.out.print(j);
                                                                  System.out.println;
                                                                  }

                                                     }
                  else if (k>n) break;
                  t++;
                  }
               Потом делитьчисло фиб.  на 2 если остача 1 выход из цыкла, если нет уменьшение десятичного разряда и далее повторять цыкл. Хотя догадуюсь что надо do while ибо первую точно не прихопят?                                    
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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