Это не универсальный ответ, и он работает только потому, что домен ограничен.Идея состоит в том, чтобы вернуть все цифры (сотни, десятки и единицы) вместе. "Некоторые мысли о конкретных диапазонах чисел:
100 легко, потому что десятки и единицы равны нулю. Нетдругие трехзначные числа, что хорошо, потому что все, что не равно нулю или имеет место в десятке, вызовет проблемы ниже.
Все числа меньше 100 могут включать сотню цифр в ответе, потому что это всегда будет ноль.
Любое кратное 10 легко, просто включите каждую сотню десятых и одно значение, потому что другие цифры равны нулю.
Сложная часть - это место.способ "отменить" это значение, если предполагается, что должна быть возвращена большая цифра. Например, 87, мы хотим 8, но хотим отменить 7.
Это приводит к идее
(ten - 9)*(ten - 8)*(ten - 7)*(ten - 6)*(ten - 5)*(ten - 4)*(ten - 3)*(ten - 2)*(ten - 1)
То, что происходит, это то, что всякий раз, когда место десятки ненулевое, вышеприведенное значение будет равно нулю. Таким образом, мы можем умножить это место на ноль, чтобы обнулитьсвое место, когда место десятки ненулевое.Тем не менее, есть проблема, когда десятка занимает ноль.В этом случае мы в 9 раз!(девять факториалов = 362880) и неправильный знак.Вот почему добавлен дополнительный знак минус, и разделите его на 362880, чтобы получить правильный ответ, когда место десятого равно нулю.
public int GetFirstDigit(int n)
{
var hundred = (n % 1000) / 100;
var ten = (n % 100) / 10;
var one = n % 10;
return hundred + ten + one*
(
-(ten - 9)*(ten - 8)*(ten - 7)*(ten - 6)*(ten - 5)*(ten - 4)*(ten - 3)*(ten - 2)*(ten - 1)
) / 362880
;
}
проверьте с помощью
Enumerable.Range(0, 101).ToList().ForEach(x => Console.WriteLine(x + ": " + GetFirstDigit(x)));