Количество цифр

Время от времени перед программистом стает задача нахождения количества цифр в числе. Есть много способов решения этой задачи. В статье мы рассмотрим наиболее популярные из них.

Длина строки

Это очень простой вариант определения количества цифр, заключается в переводе числа в строковое представление с последующим определением длины строки.

public int CountDigitByString(int n)
{
    return Math.Abs(n).ToString().Length;
}

Такой метод компактный и интуитивно понятный, однако он сильно проигрывает в быстродействии другим вариантам.

Десятичный логарифм

Использование десятичного логарифма для определения количества цифр в числе, позволяет производить вычисление за линейное время.

public int CountDigitsByLog10(int n)
{
    return (n == 0) ? 1 : (int)Math.Log10(Math.Abs(n)) + 1;
}

Сравнение

Самый быстрый из приведенных методов.

private static readonly int[] Numbers = new []
{
    10,
    100,
    1000,
    10000,
    100000,
    1000000,
    10000000,
    100000000,
    1000000000
};

public int CountDigitsByCompare(int n)
{
    n = Math.Abs(n);
    for (var i = 0; i < Numbers.Length; i++)
    {
        if (n < Numbers[i])
        {
            return i + 1;
        }
    }

    return 10;
}

Деление нацело

С использованием цикла

public int CountDigitsByDiv(int n)
{
    var count = (n == 0) ? 1 : 0;
    while (n != 0)
    {
        n /= 10;
        count++;
    }

    return count;
}

Рекурсивно

public int CountDigitsByDivRecursive(int n)
{
    return (n <= 9) ? 1 : CountDigitsByDivRecursive(n / 10) + 1;
}

Разбивка числа на отдельные цифры

Разбив число на отдельные цифры, мы получаем возможность нахождения:

  • количества цифр;
  • количества четных и нечетных;
  • количества различных(уникальных) цифр числа;
  • суммы цифр числа.
public List<int> IntToDigit(int n)
{
    n = Math.Abs(n);
    var digits = new List<int>();
    while (n > 0)
    {
        int digit = n % 10;
        n /= 10;
        digits.Add(digit);
    }

    return digits;
}

Количество четных

public int EvenCount(int n)
{
    var digits = IntToDigit(n);
    var count = 0;
    foreach (var d in digits)
    {
        if (d % 2 == 0)
        {
            count++;
        }
    }

    return count;
}

//сокращенная форма записи с использованием Linq
public int EvenCountLinq(int n)
{
    return IntToDigit(n).Count(x => x % 2 == 0);
}

Количество нечетных

public int OddCount(int n)
{
    var digits = IntToDigit(n);
    var count = 0;
    foreach (var d in digits)
    {
        if (d % 2 != 0)
        {
            count++;
        }
    }

    return count;
}

public int OddCountLinq(int n)
{
    return IntToDigit(n).Count(x => x % 2 != 0);
}

Количество различных цифр в числе

public int CountUniqueDigits(int n)
{
    var a = new int[9];
    foreach (var d in IntToDigit(n))
    {
        a[d]++;
    }

    var countUnique = 0;
    foreach (var x in a)
    {
        if (x > 0)
        {
            countUnique++;
        }
    }

    return countUnique;
}

Сумма цифр числа

public int SumDigits(int n)
{
    var sum = 0;
    foreach (var d in IntToDigit(n))
    {
        sum += d;
    }

    return sum;
}

//использование Linq сокращает запись
public int SumDigitsLinq(int n)
{
    return IntToDigit(n).Sum();
}

Смотрите также: