7 / 7 / 3
Регистрация: 16.07.2012
Сообщений: 56
|
||||||
1 | ||||||
Пределы Int03.08.2012, 11:37. Показов 4089. Ответов 32
Метки нет (Все метки)
Нужно найти такое максимальное n, чтобы Фиба не выходила за пределы int и вывести его.
0
|
03.08.2012, 11:37 | |
Ответы с готовыми решениями:
32
Int выходит за пределы Обработка исключений - выход за пределы диапазона int Перевод чисел из арабских в римские. Пределы int Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec |
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 | |||||
исправил некоторые стилистические ошибки написания кода. и сделал ограничения. кол-во выберите сами.
0
|
7 / 7 / 3
Регистрация: 16.07.2012
Сообщений: 56
|
|
03.08.2012, 12:13 [ТС] | 4 |
Вообще этот пример чисто для вывода последовательности. Мы не знаем n... в итоге оно не вводится а находится и выводится. То есть пока f2(fnext) в пределах int n++
Мне бы условие где проверяется что то типа if( (f1+f2) > int ) {cout << n; break;}
0
|
Заблокирован
|
||||||
03.08.2012, 12:28 | 5 | |||||
0
|
2241 / 1741 / 732
Регистрация: 27.07.2012
Сообщений: 5,198
|
||||||
03.08.2012, 12:37 | 6 | |||||
Есть файл limits.h, где задана константа INT_MAX и UINT_MAX.
Но можно попробовать и самому вычислить, например так:
Добавлено через 1 минуту Будет работать, только если f1 и f2 типа unsigned int. А если они должны быть знаковыми, то их сумма тоже будет типа int (знаковый) и никокда не превысит 2971215073, а значит условие не выполнится никогда.
0
|
Заблокирован
|
|
03.08.2012, 12:40 | 7 |
так ли оно или иначе. код работает. запусти код из первого поста и мою последнею. введя значения 9999999999 ты увидишь различия работы
0
|
7 / 7 / 3
Регистрация: 16.07.2012
Сообщений: 56
|
|
03.08.2012, 12:54 [ТС] | 8 |
cout << sizeof(int) << endl;
4
0
|
2241 / 1741 / 732
Регистрация: 27.07.2012
Сообщений: 5,198
|
|
03.08.2012, 13:02 | 9 |
Правильно, ведь вводишь ты n типа unsigned int, максимальное значение которого 4294967295, а сравниваешь с максимальным значением для int (который со знаком) - 2971215073. Потому оно у тебя и работает. А между прочим, не понятно, так ли по условию задачи надо сделать, либо же надо просто не допустить переполнения, т.е. использовать в качестве предела 4294967295.
Добавлено через 1 минуту Правильно. 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 */
0
|
2241 / 1741 / 732
Регистрация: 27.07.2012
Сообщений: 5,198
|
||||||
03.08.2012, 13:12 | 11 | |||||
Никогда не выполнится условие окончания цикла.
Попробуйте сделать по другому: на каждом цикле запоминать предыдущее значение f1+f2 и сравнивать с новым полученным. Если новое вдруг стало меньше предыдущего (я так понял, что каждый раз значение может только увеличиваться), то значит произошло переполнение и предыдущее значение и есть решение задачи. Добавлено через 2 минуты
1
|
137 / 126 / 14
Регистрация: 03.07.2012
Сообщений: 355
|
|
03.08.2012, 13:13 | 12 |
А если эти переменные сделать тип double? У double диапазон-то больше и тогда не будет переполнения
0
|
2241 / 1741 / 732
Регистрация: 27.07.2012
Сообщений: 5,198
|
|
03.08.2012, 13:14 | 13 |
Если бы да ка бы. По коду однозначно сказано, что они - unsigned int.
Но сделать можно, в принципе. Только придётся fnext = f1 + f2 контролировать на переполнение, что я и так предложил.
0
|
Модератор
8902 / 6672 / 917
Регистрация: 14.02.2011
Сообщений: 23,499
|
|||||||||||
03.08.2012, 13:16 | 14 | ||||||||||
размер в char -ax
то что char =байту(8 бит) еще ничего не значит, на других платформах/компиляторах может быть по другому а раньше было 2,а потом может быть 8 нельзя закладываться на конкретные цифры ну ты и накрутил для беззаконного
для знакового
для 4 байт, для других размеров аналогично
0
|
2241 / 1741 / 732
Регистрация: 27.07.2012
Сообщений: 5,198
|
|
03.08.2012, 13:17 | 15 |
0
|
Модератор
8902 / 6672 / 917
Регистрация: 14.02.2011
Сообщений: 23,499
|
|
03.08.2012, 13:24 | 16 |
А значащих цифр???
Добавлено через 3 минуты сам подумай для того чтобы во все разряды записать 1 (возьму 8 бит для примера) 11111111 достаточно из 0 вычесть 1 00000000 - 1 11111111 0-1=-1
0
|
2241 / 1741 / 732
Регистрация: 27.07.2012
Сообщений: 5,198
|
|
03.08.2012, 13:27 | 17 |
Кстати, как уже было замечено, это зависит от компилятора и платформы, так что на такие вещи нельзя полагаться. Да и мешать в кучу int и double - не лучший выход.
Добавлено через 1 минуту Это мне понятно. Для меня новостью была запись uMax = (unsigned int) - 1; Не знал, что можно название типа можно так использовать.
1
|
Intel~lect
|
03.08.2012, 13:28
#18
|
0
|
7 / 7 / 3
Регистрация: 16.07.2012
Сообщений: 56
|
||||||
03.08.2012, 13:28 [ТС] | 19 | |||||
Проверте плиз...
0
|
Модератор
8902 / 6672 / 917
Регистрация: 14.02.2011
Сообщений: 23,499
|
|
03.08.2012, 13:37 | 20 |
Дубля как раз стандартизирована
кому интересно статья про то как устроены числа с плавающей запятой http://habrahabr.ru/post/112953/
2
|
03.08.2012, 13:37 | |
Помогаю со студенческими работами здесь
20
Ошибка при компиляции error: cannot convert ‘int (*)[5]’ to ‘int**’ for argument ‘1’ to ‘void Replase(int**)' В каком случае надо начинать с int main() или с int _tmain( int argc, _TCHAR* argv[] ) и т.д.? Что означает ошибка too few arguments to function ‘int my_func(int, int)’ (язык C++)? [Linker error] undefined reference to `sterling(int, int, int)' Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |