Пост из серии «спрашивали — отвечаем», довольно стандартная учебная задача, никакой особой военной хитрости нет, но раз уж, что б нет то.
Самый простой, дубовый, но самый медленный по времени выполнения способ. Обычно в школе за него по рукам бьют 🙂
static int CountDigitsStr(int n) { return ((int)Math.Abs(n)).ToString().Length; }
Получаем модуль числа [(int)Math.Abs(n)
], чтоб исключить ситуацию, если в n
окажется отрицательное число, преобразуем число в строку и получаем количество символов в строке, т.е. количество цифр числа.
Способ заключается в том, чтобы последовательно делить число на 10
, оставляя от деления целую часть, пока целая часть не станет равна 0
.
Можно сделать в двух вариантах.
В цикле:
static int CountDigitsCycle(int n) { n = (int)Math.Abs(n); //берем модуль числа int count = 0; //заводим счетчик if (n == 0) count = 1; // n == 0? Цифра одна. while (n != 0) //пока n не равно 0 { n = n / 10; //делим число на 10 count++; //прибавляем счетчик } return count; }
Какая-то специальная функция для деления нацело в C# не нужна, при делении переменной цельночисленного типа (byte
, sbyte
, short
, ushort
, int
, uint
, long
, ulong
) на целое число или цельночисленную переменную, результатом будет целое число, т.е. деление нацело произойдет автоматически.
Рекурсией:
static int CountDigitsRec(int n) { n = (int)Math.Abs(n); if (n <= 9) { return 1; } else { return CountDigitsRec(n / 10) + 1; } }
static int CountDigitsLog10(int n) { if (n == 0) { return 1; } return (int)Math.Log10(Math.Abs(n)) + 1; }
Pingback: C#, добавление лидирующих нолей к строковому представлению числа. | Персональный блог Толика Панкова
Pingback: C#, добавление лидирующих нолей к строковому представлению числа, более оптимальный способ. | Персональный блог Толика Панкова