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

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

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

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

03.08.2012, 11:37. Просмотров 1974. Ответов 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
b_kasenov47
14 / 14 / 1
Регистрация: 28.07.2012
Сообщений: 57
03.08.2012, 12:01 #2
Насколько я помню в инт влезало около 45.

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

Мне бы условие где проверяется что то типа if( (f1+f2) > int ) {cout << n; break;}
0
KostyaKulakov
Заблокирован
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
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
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
KostyaKulakov
Заблокирован
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
nsashans
7 / 7 / 0
Регистрация: 16.07.2012
Сообщений: 56
03.08.2012, 12:54  [ТС] #8
cout << sizeof(int) << endl;

4
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
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
nsashans
7 / 7 / 0
Регистрация: 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
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
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
Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
03.08.2012, 13:13 #12
Цитата Сообщение от John Prick Посмотреть сообщение
Никогда не выполнится условие окончания цикла.
А если эти переменные сделать тип double? У double диапазон-то больше и тогда не будет переполнения
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
03.08.2012, 13:14 #13
Цитата Сообщение от Intel~lect Посмотреть сообщение
А если эти переменные сделать тип double?
Если бы да ка бы. По коду однозначно сказано, что они - unsigned int.
Но сделать можно, в принципе. Только придётся fnext = f1 + f2 контролировать на переполнение, что я и так предложил.
0
ValeryS
Модератор
6653 / 5062 / 470
Регистрация: 14.02.2011
Сообщений: 16,930
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
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
03.08.2012, 13:17 #15
Цитата Сообщение от ValeryS Посмотреть сообщение
unsigned int uMax=(unsigned int)-1;
Не знал такой штуки. Буду знать.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2012, 13:17
Привет! Вот еще темы с ответами:

[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). Возвращаемым значением функции должно быть среднее значение элементов...


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

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

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