Вы используете double
(представление числа с плавающей запятой, которое не обязательно должно быть целым числом), означающее, что при делении его на делители результат не усекается.Для вашего примера (входное значение равно 378282246310005
), значение nr / 10000000000000
не равно 37, но на самом деле это double
со значением приблизительно 37,8282246 ...
Входное значение не помещается в int,поэтому функция get_int
, доступная в cs50.h, будет неуместна.Однако значение будет вписываться в long
, в среде, в которой CS50 использует 1
Объявить nr
с типом long
и используйте get_long()
для получения ввода от пользователя.Тогда значение nr / 10000000000000
будет усечено до нуля до 37, именно так, как вам нужно здесь.
Примечание относительно типов:
1 Авторы libcs50
document get_long()
с 64-битным типом со знаком для long
с учетом ожидаемой цепочки инструментов и среды.Это не всегда так, особенно если ваша среда (ОС, компилятор и т. Д.) Не соответствует тому, что авторы CS50 ожидают от вас.
Вы захотите убедиться, что ваши предположения верны, если выхотите использовать long
в других средах;неразумно обобщать, что long
будет 64-битным в будущем, без предварительной тщательной проверки, что это так.Для целей данного назначения будет достаточно указанного типа, но вы можете рассмотреть возможность изучения заголовка stdint.h
, который предоставляет типы с гарантированным указанным размером.