Час від часу перед програмістом постає задача знаходження кількості цифр в числі. Існує багато способів вирішення даної задачі. В статті ми розглянемо найбільш популярні з них.
Довжина рядка
Це дуже простий варіант визначення кількості цифр, полягає в перетворенні числа в його строкове представлення з подальшим визначенням довжини рядка.
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();
}