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

Пределы Int - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
nsashans
7 / 7 / 0
Регистрация: 16.07.2012
Сообщений: 56
03.08.2012, 11:37     Пределы Int #1
Нужно найти такое максимальное n, чтобы Фиба не выходила за пределы int и вывести его.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
 
int main()
{
    unsigned int f1, f2, fnext, n;
    f1 = 0;
    f2 = 1;
    cout << "Введите N: \n";
    cin >> n;
    cout << "Fibo:\n";
    for(int i = 0; i < n; i++)
    {       
            cout << f2 <<"\n";
            fnext=f1+f2;
            f1 = f2;
            f2 = fnext;
    }   
    
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nsashans
7 / 7 / 0
Регистрация: 16.07.2012
Сообщений: 56
03.08.2012, 13:42  [ТС]     Пределы Int #21
Так правильно)) n=47 - 2971215073
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
#include <iostream>
using namespace std;
 
int main()
{
    unsigned int f1, f2, fnext, n;
    f1 = 0;
    f2 = 1;
    n  = 0;
 
    while(1)
    {
        if (((unsigned int)-f1)<f1 ) break;
        n++;
        cout << f2 <<"\n";
        fnext = f2+f1;
        f1 = f2;
        f2 = fnext;
    
    }
   
    cout << n << endl;
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
03.08.2012, 13:43     Пределы Int #22
Цитата Сообщение от nsashans Посмотреть сообщение
C++
1
if (((unsigned int)-f2)<f2 ) break;
Не совсем понятно. Лучше так:
C++
1
if ( f1 + f2 < fnext ) break;
Всё остальное нормально. Даже работает. Только fnext инициализируйте нулём в начале программы.
nsashans
7 / 7 / 0
Регистрация: 16.07.2012
Сообщений: 56
03.08.2012, 13:45  [ТС]     Пределы Int #23
Цитата Сообщение от John Prick Посмотреть сообщение
if ( f1 + f2 < fnext ) break;
А что это значит?
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
03.08.2012, 13:48     Пределы Int #24
Как раз проверяем на переполнение. С каждым циклом f1, f2 и их сумма fnext увеличиваются. Однако, если мы увеличили f1 и f2, а их сумма вдруг почему-то стала меньше, чем полученная на предыдущем цикле, то где-то у нас случилось переполнение и мы завершаем выполнение программы.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
03.08.2012, 13:51     Пределы Int #25
Цитата Сообщение от nsashans Посмотреть сообщение
while(1)
{
if (((unsigned int)-f1)<f1 ) break;
а к чему такие сложности???
C++
1
while(!(((unsigned int)-f1)<f1 ))
а еще лучше
C++
1
2
3
do
....
while
один то раз цикл точно исполнится
nsashans
7 / 7 / 0
Регистрация: 16.07.2012
Сообщений: 56
03.08.2012, 14:15  [ТС]     Пределы Int #26
Цитата Сообщение от ValeryS Посмотреть сообщение
а к чему такие сложности???
Черновой вариант это
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
03.08.2012, 14:23     Пределы Int #27
я бы так написал

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
int main()
{
    unsigned int f1, f2, fMax, n;
    f1 = 0;
    f2 = 1;
    n  = 0;
 
   do
    {
        n++;
        fMax = f2+f1;
        f1 = f2;
        f2 = fMax;
    
    } while(fMax>=f1)
   
    cout <<"n="<< n-1 << "  ";
     cout << "Max Fibo="<<f1 <<endl;
    return 0;
}
Добавлено через 7 минут
просто с while
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main()
{
    unsigned int f1, f2, fMax, n;
    f1 = 0;
    f2 = fMax=1;
    n  = 0;
 
   while(fMax>=f1)
    {
        n++;
        fMax = f2+f1;
        f1 = f2;
        f2 = fMax;
    
    } ;
   
    cout <<"n="<< n << "  ";
     cout << "Max Fibo="<<f1 <<endl;
    return 0;
}
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
03.08.2012, 14:26     Пределы Int #28
Цитата Сообщение от ValeryS Посмотреть сообщение
то что char =байту(8 бит) еще ничего не значит, на других платформах/компиляторах может быть по другому
Вот тут я позволю себе вставить свои пять копеек:
Размер char всегда равен одному байту. Это гарантировано Стандартом языка (5.3.3). А вот байт - не всегда равен 8 битам. "В военное время значение пи может достигать и четырех..." Успешно существуют платформы, на которых байт - 32 бита, например.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
03.08.2012, 14:30     Пределы Int #29
Цитата Сообщение от CheshireCat Посмотреть сообщение
Вот тут я позволю себе вставить свои пять копеек:
Размер char всегда равен одному байту.
Согласен полностью
Байт минимальная величина
Просто де факто принято считать байт 8 бит хотя я видел и 7 а ты говоришь и про
Цитата Сообщение от CheshireCat Посмотреть сообщение
Успешно существуют платформы, на которых байт - 32 бита
и я коряво выразился
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
03.08.2012, 15:00     Пределы Int #30
C
1
2
3
4
5
6
7
8
#include <stdio.h>
#include <math.h>
#include <limits.h>
 
int main(void) {
    printf("%d\n", (int)(log(sqrt(5.0) * UINT_MAX) / log((1.0 + sqrt(5.0)) / 2.0)));
    return 0;
}
Intel~lect
03.08.2012, 16:16
  #31

Не по теме:

Цитата Сообщение от easybudda Посмотреть сообщение
printf("%d\n", (int)(log(sqrt(5.0) * UINT_MAX) / log((1.0 + sqrt(5.0)) / 2.0)));
Извините, вы не могли объяснить как это высчитывается, а то никак не могу понять Зачем искать корень из 5?

Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
03.08.2012, 16:40     Пределы Int #32
Цитата Сообщение от easybudda Посмотреть сообщение
C
1
(int)(log(sqrt(5.0) * UINT_MAX) / log((1.0 + sqrt(5.0)) / 2.0)))
Работать-то оно работает, но если бы UINT_MAX являлся членом последовательности с чётным номером, тогда
http://www.cyberforum.ru/cgi-bin/latex.cgi?\left( \frac{1-\sqrt{5}}{2} \right)^n > 0
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{\left( \frac{1+\sqrt{5}}{2} \right)^n}{\sqrt{5}} > \frac{\left( \frac{1+\sqrt{5}}{2} \right)^n - \left( \frac{1-\sqrt{5}}{2} \right)^n}{\sqrt{5}}
Поэтому результат логарифма будет меньше, чем надо. Так что математически вроде надо бы
C
1
(int)(log(sqrt(5.0) * (UINT_MAX + 0.5)) / log((1.0 + sqrt(5.0)) / 2.0)))
Но в таком случае если UINT_MAX большой, то не хватит мантиссы float'а, надо уже переходить на double.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2012, 16:56     Пределы Int
Еще ссылки по теме:

C++ Обработка исключений - выход за пределы диапазона int
C++ В каком случае надо начинать с int main() или с int _tmain( int argc, _TCHAR* argv[] ) и т.д.?
Int выходит за пределы C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
03.08.2012, 16:56     Пределы Int #33
Цитата Сообщение от Intel~lect Посмотреть сообщение
Извините, вы не могли объяснить как это высчитывается, а то никак не могу понять
Прочитайте в википедии про числа Фибоначчи (http://ru.wikipedia.org/wiki/Числа_Фибоначчи), особенно внимательно "Формула Бине", там в принципе всё есть.
Из того, что http://www.cyberforum.ru/cgi-bin/latex.cgi?{F}_{n} ближайшее целое к http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{{\varphi }^{n}}{\sqrt{5}}
получаем http://www.cyberforum.ru/cgi-bin/latex.cgi?n\,=\,\log_{\varphi } (\sqrt{5}{F}_{n})
Поскольку число должно быть не больше максимального значения, полученный результат округляем к ближайшему меньшему целому (т.е. просто дробную часть отбрасываем).

Добавлено через 5 минут
Цитата Сообщение от Somebody Посмотреть сообщение
Поэтому результат логарифма будет меньше, чем надо.
Есть такой момент, но по счастливой случайности UINT_MAX не является
Цитата Сообщение от Somebody Посмотреть сообщение
членом последовательности с чётным номером


Цитата Сообщение от Somebody Посмотреть сообщение
то не хватит мантиссы float'а, надо уже переходить на double.
Тип float по-моему вообще лучше не использовать, разве-что с полной безнадёги, когда есть жёсткие ограничения памяти и неслишком требовательная к точности задача.
Yandex
Объявления
03.08.2012, 16:56     Пределы Int
Ответ Создать тему
Опции темы

Текущее время: 16:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru