Время от времени перед программистом стает задача нахождения количества цифр в числе. Есть много способов решения этой задачи. В статье мы рассмотрим наиболее популярные из них.
Длина строки
Это очень простой вариант определения количества цифр, заключается в переводе числа в строковое представление с последующим определением длины строки.
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();
}