Форум программистов, компьютерный форум 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
b_kasenov47
14 / 14 / 1
Регистрация: 28.07.2012
Сообщений: 57
03.08.2012, 12:01     Пределы Int #2
Насколько я помню в инт влезало около 45.

Добавлено через 2 минуты
макс. число, которое может вычислить ваща прога:
F(48) = 2971215073
KostyaKulakov
Заблокирован
03.08.2012, 12:02     Пределы Int #3
исправил некоторые стилистические ошибки написания кода. и сделал ограничения. кол-во выберите сами.
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
#include <iostream>
using namespace std;
 
int main()
{
    unsigned int f1, f2, fnext, n;
    f1 = 0;
    f2 = 1;
 
    cout << "Введите N: ";
    cin >> n;
 
    int maximuminput = 200;  //сюда ввести колличество максимально ввода. как пример взял 200
 
    if (n > maximuminput)
        {
            cout << "An incorrect entry!:\n";
        }
    else
    {
        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, 12:13  [ТС]     Пределы Int #4
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
исправил некоторые стилистические ошибки написания кода. и сделал ограничения. кол-во выберите сами.
Вообще этот пример чисто для вывода последовательности. Мы не знаем n... в итоге оно не вводится а находится и выводится. То есть пока f2(fnext) в пределах int n++

Мне бы условие где проверяется что то типа if( (f1+f2) > int ) {cout << n; break;}
KostyaKulakov
Заблокирован
03.08.2012, 12:28     Пределы Int #5
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
#include <iostream>
using namespace std;
 
int main()
{
    unsigned int f1, f2, fnext, n;
    f1 = 0;
    f2 = 1;
 
    cout << "Введите N: ";
    cin >> n;
 
 
    cout << "Fibo:\n";
    
        for(int i = 0; i < n; i++)
            {       
                    cout << f2 <<"\n";
                    fnext=f1+f2;
                    f1 = f2;
                    f2 = fnext;
                        if( (f1+f2) >  2971215073)  //максималка Int = 3435973836. но разницы особой не имеет. решение работает.
                            {
                                cout << n; 
                                break;
                            }
            }   
    
    return 0;
}
вроде должно работать. проверти.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
03.08.2012, 12:37     Пределы Int #6
Есть файл limits.h, где задана константа INT_MAX и UINT_MAX.
Но можно попробовать и самому вычислить, например так:
C++
1
2
3
4
5
6
7
8
9
    typedef unsigned char byte;
    const byte SizeOfInt = sizeof(int); // размер int в байтах
    unsigned int maximum = 0;
    byte i = 0;
    while (i < SizeOfInt)
    {
        maximum += 0xFF * static_cast<unsigned int>(pow(static_cast<double>(0x100), i));
        ++i;
    };
Немного мутно, но смысл в том, чтобы выяснить, сколько байт занимает переменная типа int и заполнить каждый байт значением 0xFF. В результате получится максимальное значение для int.

Добавлено через 1 минуту
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
if( (f1+f2) > 2971215073)
Будет работать, только если f1 и f2 типа unsigned int. А если они должны быть знаковыми, то их сумма тоже будет типа int (знаковый) и никокда не превысит 2971215073, а значит условие не выполнится никогда.
KostyaKulakov
Заблокирован
03.08.2012, 12:40     Пределы Int #7
Цитата Сообщение от John Prick Посмотреть сообщение
Есть файл limits.h, где задана константа INT_MAX и UINT_MAX.
Но можно попробовать и самому вычислить, например так:
C++
1
2
3
4
5
6
7
8
9
    typedef unsigned char byte;
    const byte SizeOfInt = sizeof(int); // размер int в байтах
    unsigned int maximum = 0;
    byte i = 0;
    while (i < SizeOfInt)
    {
        maximum += 0xFF * static_cast<unsigned int>(pow(static_cast<double>(0x100), i));
        ++i;
    };
Немного мутно, но смысл в том, чтобы выяснить, сколько байт занимает переменная типа int и заполнить каждый байт значением 0xFF. В результате получится максимальное значение для int.

Добавлено через 1 минуту

Будет работать, только если f1 и f2 типа unsigned int. А если они должны быть знаковыми, то их сумма тоже будет типа int (знаковый) и никокда не превысит 2971215073, а значит условие не выполнится никогда.
так ли оно или иначе. код работает. запусти код из первого поста и мою последнею. введя значения 9999999999 ты увидишь различия работы
nsashans
7 / 7 / 0
Регистрация: 16.07.2012
Сообщений: 56
03.08.2012, 12:54  [ТС]     Пределы Int #8
cout << sizeof(int) << endl;

4
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
03.08.2012, 13:02     Пределы Int #9
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
введя значения 9999999999 ты увидишь различия работы
Правильно, ведь вводишь ты n типа unsigned int, максимальное значение которого 4294967295, а сравниваешь с максимальным значением для int (который со знаком) - 2971215073. Потому оно у тебя и работает. А между прочим, не понятно, так ли по условию задачи надо сделать, либо же надо просто не допустить переполнения, т.е. использовать в качестве предела 4294967295.

Добавлено через 1 минуту
Цитата Сообщение от nsashans Посмотреть сообщение
cout << sizeof(int) << endl;
4
Правильно. Int занимает 4 байта. т.е. в него максимально можно записать 0xFFFFFFFF (4 байта по 0xFF), что как раз равно 4294967295 (если без знака) или 2971215073 (если со знаком).
nsashans
7 / 7 / 0
Регистрация: 16.07.2012
Сообщений: 56
03.08.2012, 13:05  [ТС]     Пределы Int #10
Примерно так нужно, но это неправильно(бесконечный цикл получается)
/* отрывок
4289947329
319972417
314952450
634924867
949877317
1584802184
2534679501
4119481685
2359193890
2183708279
*/
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, fnext, n;
    f1 = 0;
    f2 = 1;
    n  = 0;
 
    while((f2+f1) < 4294967295)
    {
        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:12     Пределы Int #11
Цитата Сообщение от nsashans Посмотреть сообщение
while((f2+f1) < 4294967295)
Никогда не выполнится условие окончания цикла.
Попробуйте сделать по другому: на каждом цикле запоминать предыдущее значение f1+f2 и сравнивать с новым полученным. Если новое вдруг стало меньше предыдущего (я так понял, что каждый раз значение может только увеличиваться), то значит произошло переполнение и предыдущее значение и есть решение задачи.

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
    while(true)
    {
        cout << f2 <<"\n";
        if ( (f2+f1) < fnext )
            break;
        fnext = f2 + f1;
        f1 = f2;
        f2 = fnext;
        n++;
    }
Intel~lect
 Аватар для Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
03.08.2012, 13:13     Пределы Int #12
Цитата Сообщение от John Prick Посмотреть сообщение
Никогда не выполнится условие окончания цикла.
А если эти переменные сделать тип double? У double диапазон-то больше и тогда не будет переполнения
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
03.08.2012, 13:14     Пределы Int #13
Цитата Сообщение от Intel~lect Посмотреть сообщение
А если эти переменные сделать тип double?
Если бы да ка бы. По коду однозначно сказано, что они - unsigned int.
Но сделать можно, в принципе. Только придётся fnext = f1 + f2 контролировать на переполнение, что я и так предложил.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,039
03.08.2012, 13:16     Пределы Int #14
Цитата Сообщение от John Prick Посмотреть сообщение
const byte SizeOfInt = sizeof(int); // размер int в байтах
размер в char -ax
то что char =байту(8 бит) еще ничего не значит, на других платформах/компиляторах может быть по другому
Цитата Сообщение от nsashans Посмотреть сообщение
cout << sizeof(int) << endl;
4
а раньше было 2,а потом может быть 8 нельзя закладываться на конкретные цифры

Цитата Сообщение от John Prick Посмотреть сообщение
const byte SizeOfInt = sizeof(int); // размер int в байтах
unsigned int maximum = 0;
byte i = 0;
while (i < SizeOfInt)
{
maximum += 0xFF * static_cast<unsigned int>(pow(static_cast<double>(0x100), i));
++i;
};
ну ты и накрутил
для беззаконного
C++
1
unsigned int uMax=(unsigned int)-1;
0xFFFFFFFF

для знакового
C++
1
int sMax = -1/2;
0xFFFFFFFF/2=0x7FFFFFFF

для 4 байт, для других размеров аналогично
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
03.08.2012, 13:17     Пределы Int #15
Цитата Сообщение от ValeryS Посмотреть сообщение
unsigned int uMax=(unsigned int)-1;
Не знал такой штуки. Буду знать.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,039
03.08.2012, 13:24     Пределы Int #16
Цитата Сообщение от Intel~lect Посмотреть сообщение
У double диапазон-то больше и тогда не будет переполнения
А значащих цифр???

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

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

Не по теме:

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

nsashans
7 / 7 / 0
Регистрация: 16.07.2012
Сообщений: 56
03.08.2012, 13:28  [ТС]     Пределы Int #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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2012, 13:37     Пределы Int
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,039
03.08.2012, 13:37     Пределы Int #20
Цитата Сообщение от John Prick Посмотреть сообщение
Кстати, как уже было замечено, это зависит от компилятора и платформы
Дубля как раз стандартизирована
кому интересно статья про то как устроены числа с плавающей запятой
http://habrahabr.ru/post/112953/
Yandex
Объявления
03.08.2012, 13:37     Пределы Int
Ответ Создать тему
Опции темы

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