Вы не предоставили определение функции expo()
, поэтому невозможно сказать, почему функция digit()
не работает.
Однако вы работаете с int переменные. Спецификация размера типа int
зависит от реализации. Различные компиляторы могут иметь целые числа разного размера. И даже данный компилятор может иметь разные размеры в зависимости от параметров компиляции.
Если конкретный компилятор, который использует ваш класс CS50, имеет 16-битные целые числа (вряд ли в наши дни, но теоретически возможно), эти значения будут go от 0 (0x0000) до 32767 (0x7FFF), а затем переходите к -32768 (0x8000) и до 01 (0xFFFF). Таким образом, в этом случае ваша функция digit
будет обрабатывать только часть диапазона до 5 десятичных цифр.
Если ваш компилятор использует 32-битные целые числа, тогда ваши целые числа будут go из 0 (0x00000000) до 2147483647 (0x7FFFFFFF), затем обернуть до -2147483648 (0x80000000) и до -1 (0xFFFFFFFF), таким образом ограничившись частью 10-битного диапазона.
Я собираюсь go рискните и угадайте, что у вас есть 32-битные целые числа.
Вы можете получить дополнительный бит, используя тип unsigned int
везде, где вы говорите int
. Но в основном вы будете ограничены компилятором и реализацией.
Если вы хотите получить количество десятичных цифр в гораздо больших значениях, вам рекомендуется использовать строковый ввод, а не numeri c ввод. Тогда вы просто посмотрите на длину строки. В качестве дополнительного вознаграждения вы также можете убрать начальные 0, возможно, опустить начальный знак плюса, возможно, опустить запятые в строке. И было бы неплохо распознать недопустимые строки с неожиданными нечисловыми c символами. Но в основном все это зависит от изучения этих строковых функций.