0 / 0 / 0
Регистрация: 17.01.2013
Сообщений: 41
1

Составить программу определения числа Фибоначчи по его номеру в последовательности

18.01.2013, 23:34. Показов 19050. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Числа Фибоначчи 1, 1, 2, 3, 5, 8, 13 и т.д. В общем случае числа Фибоначчи (fn) определяются формулами: f0=f1=1; fn=fn-1+fn-2 при n=2,3,...
Составить программу определения числа Фибоначчи по его номеру в последовательности.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  int  i, n,f3;
            Console.WriteLine("Значение какого элемента ряда Фибоначчи вы хотите узнать?");
            n = Convert.ToInt32(Console.ReadKey());
            int f0 = 0;
            int f1 = 0;
            for (i=2; i<=n; i++)
            {
                int f2 = f0 + f1;
                f0 = f1;
                f1 = f2;
                f3 = f1 + f2;
            }
            Console.WriteLine("Число Фибоначчи {0}");
            Console.ReadKey();
Где здесь ошибка??
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.01.2013, 23:34
Ответы с готовыми решениями:

Функция для определения числа Фибоначчи по его номеру
Задание: Написать функцию, которой на вход подаётся целое число - номер числа Фибоначчи, на выходе...

Функция для определения числа Фибоначчи по его номеру
Задание: Написать функцию, которой на вход подаётся целое число - номер числа Фибоначчи, на выходе...

Поиск числа Фибоначчи (через операторы цикла for, while и do . while) по его номеру в последовательности
Здравствуйте,подскажите,пожалуйста, как реализовать это тз для отрицательного значения,при этом...

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

17
124 / 37 / 6
Регистрация: 14.01.2012
Сообщений: 264
19.01.2013, 00:06 2
Цитата Сообщение от nfnmzyf1406 Посмотреть сообщение
Console.WriteLine("Число Фибоначчи {0}");
То что заметил беглым взглядом, Вы не указали аргумент 0.
Должно быть так:
Console.WriteLine("Число Фибоначчи {0}", ваш аргумент);

Цитата Сообщение от nfnmzyf1406 Посмотреть сообщение
int f0 = 0;
int f1 = 0;
Так же тут можно просто указать
int f0;
int f1;
По умолчанию будет 0.

Добавлено через 13 минут
Логика в цикле отсутствует, операторы f0,f1,f2 просто передают друг другу значение 0.
Если я правильно Вас понял, должно что то типо такого получится.

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 int i, n, fn;
            Console.WriteLine("Значение какого элемента ряда Фибоначчи вы хотите узнать?");
            n = Convert.ToInt32(Console.ReadLine());
            int f0 = 0;
            int f1 = 0;
            int f2;
            for (i = 2; i <= n; i++)
            {
                f2 = f0 + f1;
                fn = f1*n + f2*n;
                Console.WriteLine("Число Фибоначчи {0}", fn);
                f0++;
                f1++;
            }
            
            Console.ReadKey();


Добавлено через 6 минут
Если надо вывести только последнее число, то делаем так:

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int i, n, fn;
            Console.WriteLine("Значение какого элемента ряда Фибоначчи вы хотите узнать?");
            n = Convert.ToInt32(Console.ReadLine());
            int f0 = 0;
            int f1 = 0;
            int f2;
            for (i = 2; i <= n; i++)
            {
                f2 = f0 + f1;
                fn = f1*n + f2*n;
                f0++;
                f1++;
                if (i == n)
                {
                    Console.WriteLine("Число Фибоначчи {0}", fn);
                }
            }
            
            Console.ReadKey();
0
284 / 255 / 73
Регистрация: 17.07.2012
Сообщений: 618
19.01.2013, 00:40 3
А мне лично по кайфу рекурсивный метод
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
static void Main()
    {
        Console.Write("n=");
        int n = int.Parse(Console.ReadLine());
        for (int i = 1; i <= n; i++)
            Console.WriteLine("Число A{0} = {1}",i, Fiban(i));
        Console.ReadLine();
    }
    static int Fiban(int n)
    {
        if (n == 1 || n == 2) return 1;
        else return Fiban(n - 1) + Fiban(n - 2);
    }
0
124 / 37 / 6
Регистрация: 14.01.2012
Сообщений: 264
19.01.2013, 00:47 4
Да, хороший способ, тем более мой код выше не верно написан, т.к. я не верно понял условие.
Правда рекурсивный метод, мягко говоря не очень быстрый
Цитата Сообщение от ITL Посмотреть сообщение
static void Main()
0
284 / 255 / 73
Регистрация: 17.07.2012
Сообщений: 618
19.01.2013, 00:54 5
Sleepy_Master , абсолютно согласен, вообще конечно лучше не использовать рекурсию, но мне нравиться изящность рекурсии
Да и если студенту показать преподавателю, то все ок....я думаю
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.01.2013, 02:55 6
nfnmzyf1406, Вот функция, которая считает Фибоначчи. Вам остается только разобраться (большая просьба не просто тупо копировать)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        private static long Fibonacci(int n)
        {            
            if (n == 0)
                return 0;
            long fib_n_2 = 0, fib_n_1 = 1;
            for (int i = 1; i < n; i++)
            {
                var temp = fib_n_1;
                fib_n_1 += fib_n_2;
                fib_n_2 = temp;
            }
            return fib_n_1;
        }
Sleepy_Master, очень мягко. Сложность алгоритма больше факториала. Я даже тестовую програмульку писал.
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
36
37
38
39
40
41
42
43
using System;
using System.Diagnostics;
 
namespace ConsoleApplication13
{
    internal class Program
    {
        private static long Fib(int n)
        {
            return n > 1 ? Fib(n - 1) + Fib(n - 2) : n;
        }
 
        private static long Fibonacci(int n)
        {
            if (n == 0)
                return 0;
            long fib_n_2 = 0, fib_n_1 = 1;              
            for (int i = 1; i < n; i++)
            {
                var temp = fib_n_1;
                fib_n_1 += fib_n_2;
                fib_n_2 = temp;
            }
            return fib_n_1;
        }
 
        private static void Main()
        {
            const int iters = 100;
            var sw = new Stopwatch();
            sw.Start();
            Console.WriteLine(Fibonacci(iters));
            long sw1 = sw.ElapsedTicks;
            Console.WriteLine(sw1);
            sw.Restart();
            Console.WriteLine(Fib(iters));
            long sw2 = sw.ElapsedTicks;
            Console.WriteLine(sw2);
            Console.WriteLine("Итеративный метод быстрее в {0} раз", sw2/sw1);
            Console.ReadKey();
        }
    }
}
Попробуйте запустить с различными Iters, будете удивлены.

Добавлено через 2 минуты
Начальное значение поставьте лучше 40, а следующее - 41 А то для сотни я ждал больше недели результата, так и не дождался.
0
0 / 0 / 0
Регистрация: 17.01.2013
Сообщений: 41
19.01.2013, 06:56  [ТС] 7
Cпасибо большое, обязательно разберусь с ней)
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.01.2013, 07:13 8
Только условие не
C#
1
if (n == 0)
а
C#
1
if (n <= 0)
0
124 / 37 / 6
Регистрация: 14.01.2012
Сообщений: 264
19.01.2013, 16:11 9
Здесь был вопрос на который сам ответил) можно удалить)

Добавлено через 5 минут
Цитата Сообщение от nfnmzyf1406 Посмотреть сообщение
f0=f1=1; fn=fn-1+fn-2 при n=2,3
Это не формула, а линейное рекуррентное соотношение )
Оно отображает по какому принципу происходит нахождение желаемого числа Фибоначчи.
1
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.01.2013, 20:52 10
Sleepy_Master, по классике числа фибоначчи с нуля начинаются
http://ru.wikipedia.org/wiki/%... 1%87%D0%B8
0
124 / 37 / 6
Регистрация: 14.01.2012
Сообщений: 264
19.01.2013, 22:04 11
Цитата Сообщение от Psilon Посмотреть сообщение
по классике числа фибоначчи с нуля начинаются
Я этого не отрицаю.
0
124 / 37 / 6
Регистрация: 14.01.2012
Сообщений: 264
29.01.2013, 10:22 12
Удивительно другое. Что если занести эти числа в массив и вывести на консоль, получатся одинаковые треугольные пирамидки =)
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
static void Main(string[] args)
        {
 
            int n = Int32.Parse(Console.ReadLine());
            Fibonacci(n);
            Console.ReadKey();
        }
 
        private static long Fibonacci(int n)
        {
            long[,] mas = new long[n,n];
            if (n <= 0)
                return 0;
            long fib_n_2 = 0, fib_n_1 = 1;
            for (int i = 1; i < n; i++)
            {
               
                for (int j = 0; j < n; j++)
                {
                    mas[i - 1, j] = fib_n_1;
                    fib_n_1 += fib_n_2;
                    fib_n_2 = mas[i - 1, j];
                        
                       Console.Write("\t{0}", mas[i-1,j]);
                }
                Console.WriteLine();
                
            }
            return fib_n_1;
        }
А как можно сделать что б массив заполнялся по длине строки до следующего числа фибоначчи ?
Ну на подобии такого:

1 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0
1 2 0 0 0 0 0 0 0
1 2 3 0 0 0 0 0 0
1 2 3 5 0 0 0 0 0
1 2 3 5 8 0 0 0 0
1 2 3 5 8 15 0 0
1 2 3 5 8 15 21 0
1 2 3 5 8 15 21 36

и т.д. ?
0
543 / 544 / 181
Регистрация: 16.03.2012
Сообщений: 1,160
Записей в блоге: 2
29.01.2013, 10:48 13
Цитата Сообщение от Sleepy_Master Посмотреть сообщение
1 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0
1 2 0 0 0 0 0 0 0
1 2 3 0 0 0 0 0 0
1 2 3 5 0 0 0 0 0
1 2 3 5 8 0 0 0 0
1 2 3 5 8 15 0 0
1 2 3 5 8 15 21 0
1 2 3 5 8 15 21 36
Если это вы скопировали с консоли, то ваше решение немного не верно, после 8 долно идти 13!, а после 21 - 34!

Вот стандартое решение такой задачи через рекурсию:
C#
1
2
3
4
5
6
7
8
9
10
static void Main()
    {
        Console.WriteLine("Введите номер элемента последовательности Фибоначчи: ");
        int n = Convert.ToInt16(Console.ReadLine());
        Console.WriteLine(fib(n));
    }
    static int fib(int n)
    {
        return n > 1 ? fib(n - 1) + fib(n - 2) : n;
    }
1
124 / 37 / 6
Регистрация: 14.01.2012
Сообщений: 264
29.01.2013, 11:22 14
Не с консоли копировал, опечатался ))
Уже сделал как хотел ))
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
static void Main(string[] args)
        {
 
            int n = Int32.Parse(Console.ReadLine());
            Fibonacci(n);
            Console.ReadKey();
        }
        private static long Fibonacci(int n)
        {
            if (n <= 0)
                return 0;
            long[,] mas = new long[n, n];
            long fib_n_2 = 0, fib_n_1 = 1;
            for (int i = 1; i < n; i++)
            {
                var temp = fib_n_1;
                fib_n_1 += fib_n_2;
                fib_n_2 = temp;
                
                for (int j = 1; j < n; j++)
                {
                    mas[j, i] = fib_n_1;
                    Console.Write("\t{0}", mas[i, j]);
                    
                }
                Console.WriteLine();
            }
            return fib_n_1;
        }
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
29.01.2013, 11:48 15
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
using System;
using System.Collections.Generic;
 
namespace PrintFib
{
    class Program
    {
        private static void Main()
        {
 
            int n = int.Parse(Console.ReadLine());
            string s = "";
            foreach (long fib in Fibonacci(n))
                Console.WriteLine(s += fib + " ");
            Console.ReadKey();
        }
 
        private static IEnumerable<long> Fibonacci(int n)
        {
            if (n <= 0)
                yield break;
            long fib_n_2 = 0, fib_n_1 = 1;
            for (int i = 1; i < n; i++)
            {
                var temp = fib_n_1;
                yield return fib_n_1 += fib_n_2;
                fib_n_2 = temp;
            }
        }
    }
}
1
124 / 37 / 6
Регистрация: 14.01.2012
Сообщений: 264
29.01.2013, 15:45 16
Красота, спасибо ))

Добавлено через 2 минуты
Что делает yield ?
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
29.01.2013, 20:00 17
Sleepy_Master, возвращает значение, но не выходит из метода. Фактически этот код равносилен

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        private static IEnumerable<long> Fibonacci(int n)
        {
            var list = new List<long>();
            if (n <= 0)
                return Enumerable.Empty;
            long fib_n_2 = 0, fib_n_1 = 1;
            for (int i = 1; i < n; i++)
            {
                var temp = fib_n_1;
                list.Add(fib_n_1 += fib_n_2);
                fib_n_2 = temp;
            }
            return (IEnumerable<long>) list;
        }
0
Заблокирован
03.03.2013, 13:44 18
А ведь за логарифм ни кто решения не предложил. Не ужели все так плохо?
0
03.03.2013, 13:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2013, 13:44
Помогаю со студенческими работами здесь

Поиск числа из последовательности по его номеру
Ребят, помогите, пожалуйста с задачей.. Хотя бы с идеей...) У нас есть числовой ряд. Он состоит из...

Составить программу вычисления n-го члена последовательности Фибоначчи
помогите нужна помощь в решении задачек на ASSEMBLER 1) составить программу для нахождения...

Составить программу вычисления n-го члена последовательности Фибоначчи
Помогите, пож, решить 3 задачи в ассемблере.... ЗАВТРА ЭКЗ......... 0_о НЕ ДАЙТЕ...

Составить программу определения произведения отрицательных чисел последовательности
ТЕМА: Циклические алгоритмы. написание программ с использованием циклических конструкций...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru