Кількість цифр

Час від часу перед програмістом постає задача знаходження кількості цифр в числі. Існує багато способів вирішення даної задачі. В статті ми розглянемо найбільш популярні з них.

Довжина рядка

Це дуже простий варіант визначення кількості цифр, полягає в перетворенні числа в його строкове представлення з подальшим визначенням довжини рядка.

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();
}

Дивіться також: