7 / 7 / 3
Регистрация: 16.07.2012
Сообщений: 56
1

Пределы Int

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

Author24 — интернет-сервис помощи студентам
Нужно найти такое максимальное 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.08.2012, 11:37
Ответы с готовыми решениями:

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

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

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

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

32
14 / 14 / 3
Регистрация: 28.07.2012
Сообщений: 57
03.08.2012, 12:01 2
Насколько я помню в инт влезало около 45.

Добавлено через 2 минуты
макс. число, которое может вычислить ваща прога:
F(48) = 2971215073
0
Заблокирован
03.08.2012, 12:02 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;
}
0
7 / 7 / 3
Регистрация: 16.07.2012
Сообщений: 56
03.08.2012, 12:13  [ТС] 4
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
исправил некоторые стилистические ошибки написания кода. и сделал ограничения. кол-во выберите сами.
Вообще этот пример чисто для вывода последовательности. Мы не знаем n... в итоге оно не вводится а находится и выводится. То есть пока f2(fnext) в пределах int n++

Мне бы условие где проверяется что то типа if( (f1+f2) > int ) {cout << n; break;}
0
Заблокирован
03.08.2012, 12:28 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;
}
вроде должно работать. проверти.
0
2268 / 1761 / 739
Регистрация: 27.07.2012
Сообщений: 5,233
03.08.2012, 12:37 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, а значит условие не выполнится никогда.
0
Заблокирован
03.08.2012, 12:40 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 ты увидишь различия работы
0
7 / 7 / 3
Регистрация: 16.07.2012
Сообщений: 56
03.08.2012, 12:54  [ТС] 8
cout << sizeof(int) << endl;

4
0
2268 / 1761 / 739
Регистрация: 27.07.2012
Сообщений: 5,233
03.08.2012, 13:02 9
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
введя значения 9999999999 ты увидишь различия работы
Правильно, ведь вводишь ты n типа unsigned int, максимальное значение которого 4294967295, а сравниваешь с максимальным значением для int (который со знаком) - 2971215073. Потому оно у тебя и работает. А между прочим, не понятно, так ли по условию задачи надо сделать, либо же надо просто не допустить переполнения, т.е. использовать в качестве предела 4294967295.

Добавлено через 1 минуту
Цитата Сообщение от nsashans Посмотреть сообщение
cout << sizeof(int) << endl;
4
Правильно. Int занимает 4 байта. т.е. в него максимально можно записать 0xFFFFFFFF (4 байта по 0xFF), что как раз равно 4294967295 (если без знака) или 2971215073 (если со знаком).
0
7 / 7 / 3
Регистрация: 16.07.2012
Сообщений: 56
03.08.2012, 13:05  [ТС] 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;
}
0
2268 / 1761 / 739
Регистрация: 27.07.2012
Сообщений: 5,233
03.08.2012, 13:12 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++;
    }
1
137 / 126 / 14
Регистрация: 03.07.2012
Сообщений: 355
03.08.2012, 13:13 12
Цитата Сообщение от John Prick Посмотреть сообщение
Никогда не выполнится условие окончания цикла.
А если эти переменные сделать тип double? У double диапазон-то больше и тогда не будет переполнения
0
2268 / 1761 / 739
Регистрация: 27.07.2012
Сообщений: 5,233
03.08.2012, 13:14 13
Цитата Сообщение от Intel~lect Посмотреть сообщение
А если эти переменные сделать тип double?
Если бы да ка бы. По коду однозначно сказано, что они - unsigned int.
Но сделать можно, в принципе. Только придётся fnext = f1 + f2 контролировать на переполнение, что я и так предложил.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,512
03.08.2012, 13:16 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 байт, для других размеров аналогично
0
2268 / 1761 / 739
Регистрация: 27.07.2012
Сообщений: 5,233
03.08.2012, 13:17 15
Цитата Сообщение от ValeryS Посмотреть сообщение
unsigned int uMax=(unsigned int)-1;
Не знал такой штуки. Буду знать.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,512
03.08.2012, 13:24 16
Цитата Сообщение от Intel~lect Посмотреть сообщение
У double диапазон-то больше и тогда не будет переполнения
А значащих цифр???

Добавлено через 3 минуты
Цитата Сообщение от John Prick Посмотреть сообщение
Не знал такой штуки. Буду знать.
сам подумай
для того чтобы во все разряды записать 1 (возьму 8 бит для примера)
11111111
достаточно из 0 вычесть 1
00000000
-
1
11111111
0-1=-1
0
2268 / 1761 / 739
Регистрация: 27.07.2012
Сообщений: 5,233
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
7 / 7 / 3
Регистрация: 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
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,512
03.08.2012, 13:37 20
Цитата Сообщение от John Prick Посмотреть сообщение
Кстати, как уже было замечено, это зависит от компилятора и платформы
Дубля как раз стандартизирована
кому интересно статья про то как устроены числа с плавающей запятой
http://habrahabr.ru/post/112953/
2
03.08.2012, 13:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.08.2012, 13:37
Помогаю со студенческими работами здесь

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

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

Что означает ошибка too few arguments to function ‘int my_func(int, int)’ (язык C++)?
В чём проблема? #include &lt;iostream&gt; int my_func (int i, int j){ int z; z=i+j; return...

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


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

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

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