Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
syrga
5 / 5 / 2
Регистрация: 04.12.2010
Сообщений: 65
#1

фибоначчи( функции,массивы) - C++

13.01.2012, 10:04. Просмотров 860. Ответов 9
Метки нет (Все метки)

написать программу вычисляющую 100-ое число фибоначчи. 2 варианта:используя функцию и используя массив....

Добавлено через 48 минут
он не правильно находит 100 позицию....Что делать????:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <stdio.h>
using namespace std;
double fib(int n) {
    double f1, f2, fn;
    int i;
    f1 = 1; f2 = 1;
    if (n == 0) return 0;
    else if ((n == 1) || (n == 2)) return 1;
    else for(i = 3; i <= n; ++i) {
        fn = f1 + f2;
        f1 = f2;
        f2 = fn;
    }
    return fn;
}
int main() {
    int n;
    cout << " n pozicii: ";
    cin >> n;
    printf(" %d -oe chislo fib %f\n", n, fib(n));
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2012, 10:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос фибоначчи( функции,массивы) (C++):

Одномерные массивы (генерация чисел первыми 15 числами Фибоначчи, функции) - C++
Объявите одномерный целочисленный массив, в котором 15 элементов. Выполните генерацию массива первыми 15 числами Фибоначчи. Выведите Массив...

рекурсия и массивы: числа Фибоначчи - C++
привет всем ! как с помощью рекурсии с параметрами массива реализовать числа Фибоначчи ? вот что то на клепал #include &quot;stdafx.h&quot; ...

Указатели и массивы. Индексация с помощью указателей. Передача массивов в функции. Динамические массивы (обработка матриц) - C++
Для каждого элемента , bij, i= 1,...,n , j=1,...,n определяется свой многоугольник местонахождением соответствующего элемента aij (см....

Функции. Рекурсия на примере Фибоначчи - C++
Можете начинающему объяснить решен задачи про числа фиибоначи с помощью рекурсии. Вот код // Fibonacci series using recursion ...

Решение функции методом Квадратичной аппроксимации и Фибоначчи - C++
Помогите решить данную функцию методом квадратичной аппроксимации и Фибоначчи f(x) = log(cos(x))+cos(x) Интервал Экстремум max

Visual C++ тема функции. Построить последовательность чисел Фибоначчи. - C++
Для заданного числа N&gt;1 построить последовательность чисел фибоначчи А(0), А(1), .... А(n), которые изменяются по закону...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
brainfrog
4 / 4 / 0
Регистрация: 07.11.2011
Сообщений: 6
13.01.2012, 11:00 #2
По-моему вычисляет правильно, выводит неправильно. Попробуйте сделать вывод так:
C++
1
2
3
#include <iomanip> // для setprecision
//...
cout << n << "-oe chislo fib = " << setprecision(30) << fib(n) << endl;
syrga
5 / 5 / 2
Регистрация: 04.12.2010
Сообщений: 65
13.01.2012, 11:32  [ТС] #3
Цитата Сообщение от brainfrog Посмотреть сообщение
setprecision(30)
а что это значит?

Добавлено через 8 минут
всё равно не работает(((
табаков
1 / 1 / 0
Регистрация: 13.01.2012
Сообщений: 25
13.01.2012, 11:38 #4
setprecision
setw

используются при табуляции
setprecision помоему знаков после запятой обозначает
syrga
5 / 5 / 2
Регистрация: 04.12.2010
Сообщений: 65
13.01.2012, 12:06  [ТС] #5
выводится: fib=354224848179262000000

как сделать так чтобы было без нулей????
golatin
266 / 223 / 43
Регистрация: 12.10.2011
Сообщений: 328
Завершенные тесты: 1
13.01.2012, 12:12 #6
Проблема скорее всего в double
из MSDN
тип: double
размер: ±5.0 × 10−324 to ±1.7 × 10308
точность: 15-16 digits

Твоя программа неправильно начинает считать уже с 79 числа вместо 14472334024676221 выдает 14472334024676220

long long int тоже не подходит: предел 92-oe число 7540113804746346429

Вводи длинную арифметику 100 число 354224848179261915075 (21 цифра) - очень большое
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.01.2012, 12:59 #7
Да, эта задача нерешаема через стандартные типы. Только через длинную арифметику.
syrga
5 / 5 / 2
Регистрация: 04.12.2010
Сообщений: 65
16.01.2012, 13:11  [ТС] #8
так значит её никак не решить???
помогите...
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
16.01.2012, 13:15 #9
Посмотрите, вот вариант по проще http://gmplib.org/#FUNCCLASSES
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
16.01.2012, 13:24 #10
Либо так.
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <iostream>
#include <vector>
#include <cmath>
#include <sstream>
#include <string>
#include <iomanip>
#include <cstdlib>
#include <cstdio>
 
class BigInteger
{
        std::vector<int> value;
        static const int base = 1e9;
        static const int count_of_digits = 9;
        
public:
 
        BigInteger() { value.push_back(0); }   
        BigInteger( const std::string& );
        BigInteger( long long );
        BigInteger& operator = ( long long );
        
        BigInteger& operator += ( const BigInteger& );
        
        friend BigInteger operator + ( const BigInteger&, const BigInteger& );
        
        friend std::istream& operator >> ( std::istream&, BigInteger& );
        friend std::ostream& operator << ( std::ostream&, const BigInteger& );
};
 
#define double BigInteger
 
double fib(int n) {
        double f1, f2, fn;
        int i;
        f1 = 1; f2 = 1;
        if (n == 0) return 0;
        else if ((n == 1) || (n == 2)) return 1;
        else for(i = 3; i <= n; ++i) {
                fn = f1 + f2;
                f1 = f2;
                f2 = fn;
        }
        return fn;
}
 
#undef double
 
int main() {
        int n;
        std::cout << "n pozicii: ";
        std::cin >> n;
        std::cout << n << " - oe chislo fib " << fib(n) << std::endl;
}
 
BigInteger& BigInteger::operator = ( long long n )
{
    this->value = BigInteger(n).value;
    return *this;
}
 
BigInteger::BigInteger( const std::string& str )
{
        for (int i = str.length() ; i > 0 ; i -= count_of_digits)
        {
                if ( i < count_of_digits )
                {
                        value.push_back( atoi( str.substr(0, i).c_str() ) );
                }
                else
                {
                        value.push_back( atoi( str.substr(i - count_of_digits, count_of_digits).c_str() ) );
                }
        }
}
 
BigInteger::BigInteger( long long x )
{
        std::ostringstream ost;
        ost << x;
        std::string str = ost.str();
        
        for (int i = str.length() ; i > 0 ; i -= count_of_digits)
        {
                if ( i < count_of_digits )
                {
                        value.push_back( atoi( str.substr(0, i).c_str() ) );
                }
                else
                {
                        value.push_back( atoi( str.substr(i - count_of_digits, count_of_digits).c_str() ) );
                }
        }
        
}
 
BigInteger& BigInteger::operator += ( const BigInteger& b )
{
        for ( int temp = 0, i = 0; i < (int) std::max( this->value.size(), b.value.size() ) || temp != 0 ; ++i)
        {
                if ( i == (int) value.size() )
                        value.push_back( 0 );
                
                value[i] += temp + ( i < (int) b.value.size() ? b.value[i] : 0 );
                temp = value[i] >= base;
                
                if ( temp != 0 )
                        value[i] -= base;
        }
        
        return *this;
}
 
BigInteger operator + ( const BigInteger& a, const BigInteger& b )
{
        BigInteger c = a;
        c += b;
        return c;
}
 
std::istream& operator >> ( std::istream& stream, BigInteger& big )
{
        std::string str;
        std::cin >> str;
        big = BigInteger(str);
        
        return stream;  
}
 
std::ostream& operator << ( std::ostream& stream, const BigInteger& big )
{
        if ( big.value.empty() )
                stream << 0;
        else
                stream << big.value.back();
                
        for (int i = (int) big.value.size() - 2; i >= 0; --i)
        {
                stream << std::setfill('0') << std::setw(BigInteger::count_of_digits) << big.value[i];
        }
        
        return stream;
}
Вашу функцию оставил неизменной.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2012, 13:24
Привет! Вот еще темы с ответами:

Найти приближенное значение минимума функции методом Фибоначчи - C++
Помогите пожалуйста написать программу. Найти приближенное значение минимума заданной функции(значение функции вычислить в N=21 точках)...

Рекурсия, ряд Фибоначчи (определить количество рекурсивных вызовов функции) - C++
Здравствуйте, уважаемые форумчане ! Подскажите, пожалуйста, как определить количество рекурсивных вызовов функции ? Вот, собственно,...

Набрать с чисел Фибоначчи в интервале от 1 до 100, только просто числа, а также их порядковые номера в ряду Фибоначчи - C++
Помогите с задачкой Набрать с чисел Фибоначчи в интервале от 1 до 100, только просто числа, а также их порядковые номера в ряду...

используя рекурсивную реализацию функции для чисел фибоначчи доказать Fn + 1Fn - 1 - Fn2 = (- 1)n (Кассини)) - C++
используя рекурсивную реализацию функции для чисел фибоначчи доказать Fn + 1Fn - 1 - Fn2 = (- 1)n (Кассини)) #include...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.01.2012, 13:24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru