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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
nsashans
7 / 7 / 0
Регистрация: 16.07.2012
Сообщений: 56
#1

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

03.08.2012, 11:37. Просмотров 1973. Ответов 32
Метки нет (Все метки)

Нужно найти такое максимальное 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.08.2012, 11:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Пределы Int (C++):

Int выходит за пределы - C++
Добрый день!Проблема в следующем. Работаю с числами аля 13045652312. И нахожу остаток от деления. Но int не в ходит в пределы. Если пишу...

Перевод чисел из арабских в римские. Пределы int - C++
Есть программа: #include &lt;stdio.h&gt;; #include &lt;conio.h&gt;; int roman(int,int,char); main() { int a,z; clrscr(); while (z!=1){ ...

Обработка исключений - выход за пределы диапазона int - C++
Подскажите пожалуйста, как обработать исключение, когда например вожу очень больше число, на которое не расчитан тип int . Можно ли это как...

Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec - C++
Вот есть заголовочный файл // Заголовочный файл Vector.h #ifndef VECTOR_H #define VECTOR_H #include &lt;iostream&gt; using...

Ошибка при компиляции error: cannot convert ‘int (*)[5]’ to ‘int**’ for argument ‘1’ to ‘void Replase(int**)' - C++
#include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;iomanip&gt; #include &lt;cstdlib&gt; #define row 5 #define col 5 using namespace...

В каком случае надо начинать с int main() или с int _tmain( int argc, _TCHAR* argv[] ) и т.д.? - C++
Не понимаю, с чего начинать. Заранее спс.

32
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
03.08.2012, 13:24 #16
Цитата Сообщение от Intel~lect Посмотреть сообщение
У double диапазон-то больше и тогда не будет переполнения
А значащих цифр???

Добавлено через 3 минуты
Цитата Сообщение от John Prick Посмотреть сообщение
Не знал такой штуки. Буду знать.
сам подумай
для того чтобы во все разряды записать 1 (возьму 8 бит для примера)
11111111
достаточно из 0 вычесть 1
00000000
-
1
11111111
0-1=-1
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
03.08.2012, 13:27 #17
Цитата Сообщение от Intel~lect Посмотреть сообщение
А если эти переменные сделать тип double? У double диапазон-то больше и тогда не будет переполнения
Кстати, как уже было замечено, это зависит от компилятора и платформы, так что на такие вещи нельзя полагаться. Да и мешать в кучу int и double - не лучший выход.

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
сам подумай
для того чтобы во все разряды записать 1 (возьму 8 бит для примера)
11111111
достаточно из 0 вычесть 1
00000000
-
1
11111111
0-1=-1
Это мне понятно. Для меня новостью была запись uMax = (unsigned int) - 1; Не знал, что можно название типа можно так использовать.
1
Intel~lect
03.08.2012, 13:28
  #18

Не по теме:

Цитата Сообщение от John Prick Посмотреть сообщение
Да и мешать в кучу int и double - не лучший выход.
Согласен.

0
nsashans
7 / 7 / 0
Регистрация: 16.07.2012
Сообщений: 56
03.08.2012, 13:28  [ТС] #19
Проверте плиз...
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)-f2)<f2 ) break;
        n++;
        cout << f2 <<"\n";
        fnext = f2+f1;
        f1 = f2;
        f2 = fnext;
    
    }
   
    cout << n << endl;
    return 0;
}
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
03.08.2012, 13:37 #20
Цитата Сообщение от John Prick Посмотреть сообщение
Кстати, как уже было замечено, это зависит от компилятора и платформы
Дубля как раз стандартизирована
кому интересно статья про то как устроены числа с плавающей запятой
http://habrahabr.ru/post/112953/
2
nsashans
7 / 7 / 0
Регистрация: 16.07.2012
Сообщений: 56
03.08.2012, 13:42  [ТС] #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;
}
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
03.08.2012, 13:43 #22
Цитата Сообщение от nsashans Посмотреть сообщение
C++
1
if (((unsigned int)-f2)<f2 ) break;
Не совсем понятно. Лучше так:
C++
1
if ( f1 + f2 < fnext ) break;
Всё остальное нормально. Даже работает. Только fnext инициализируйте нулём в начале программы.
0
nsashans
7 / 7 / 0
Регистрация: 16.07.2012
Сообщений: 56
03.08.2012, 13:45  [ТС] #23
Цитата Сообщение от John Prick Посмотреть сообщение
if ( f1 + f2 < fnext ) break;
А что это значит?
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
03.08.2012, 13:48 #24
Как раз проверяем на переполнение. С каждым циклом f1, f2 и их сумма fnext увеличиваются. Однако, если мы увеличили f1 и f2, а их сумма вдруг почему-то стала меньше, чем полученная на предыдущем цикле, то где-то у нас случилось переполнение и мы завершаем выполнение программы.
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
03.08.2012, 13:51 #25
Цитата Сообщение от nsashans Посмотреть сообщение
while(1)
{
if (((unsigned int)-f1)<f1 ) break;
а к чему такие сложности???
C++
1
while(!(((unsigned int)-f1)<f1 ))
а еще лучше
C++
1
2
3
do
....
while
один то раз цикл точно исполнится
0
nsashans
7 / 7 / 0
Регистрация: 16.07.2012
Сообщений: 56
03.08.2012, 14:15  [ТС] #26
Цитата Сообщение от ValeryS Посмотреть сообщение
а к чему такие сложности???
Черновой вариант это
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
03.08.2012, 14:23 #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;
}
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,375
03.08.2012, 14:26 #28
Цитата Сообщение от ValeryS Посмотреть сообщение
то что char =байту(8 бит) еще ничего не значит, на других платформах/компиляторах может быть по другому
Вот тут я позволю себе вставить свои пять копеек:
Размер char всегда равен одному байту. Это гарантировано Стандартом языка (5.3.3). А вот байт - не всегда равен 8 битам. "В военное время значение пи может достигать и четырех..." Успешно существуют платформы, на которых байт - 32 бита, например.
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
03.08.2012, 14:30 #29
Цитата Сообщение от CheshireCat Посмотреть сообщение
Вот тут я позволю себе вставить свои пять копеек:
Размер char всегда равен одному байту.
Согласен полностью
Байт минимальная величина
Просто де факто принято считать байт 8 бит хотя я видел и 7 а ты говоришь и про
Цитата Сообщение от CheshireCat Посмотреть сообщение
Успешно существуют платформы, на которых байт - 32 бита
и я коряво выразился
0
easybudda
Модератор
Эксперт CЭксперт С++
9663 / 5612 / 952
Регистрация: 25.07.2009
Сообщений: 10,775
03.08.2012, 15:00 #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;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2012, 15:00
Привет! Вот еще темы с ответами:

[Linker error] undefined reference to `sterling(int, int, int)' - C++
#include &lt;iostream&gt; using namespace std; int sterling(int,int,int); int sterling(int,int); int sterling(int); int main() { ...

[Linker Error] Unresolved external 'Sort(int near*near ,int, int) - C++
не могу понять в чем ошибка при компиляции ошибок не выдает при запуске программы - выдает эту ошибку Unresolved external 'Sort(int...

int main() и int _tmain(int argc, _TCHAR* argv[]) - C++
При создании нового консольного приложения Microsoft Visual С++ 2010 Express создает начальный шаблон #include &quot;stdafx.h&quot; int...

Функции float average(int arrray[],int from,int to) - C++
Напишите код функции float average(int arrray,int from,int to). Возвращаемым значением функции должно быть среднее значение элементов...


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

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

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