C#, Количество цифр (разрядов) числа.
Пост из серии "спрашивали - отвечаем", довольно стандартная учебная задача, никакой особой военной хитрости нет, но раз уж, что б нет то.
Самый простой, дубовый, но самый медленный по времени выполнения способ. Обычно в школе за него по рукам бьют :)
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;
}
Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/01/16/c-ko