Найти первую цифру числа, используя только целочисленные операции

Я не могу понять, как решить проблему, которую мне дал учитель.

учитывая число N (0 первый цифра.

например:

input: 100
result: 1

input: 46
result: 4

input: 3
result: 3

сначала это казалось легким, но (как сказал учитель) это должно быть сделано с помощью только целочисленные типы данных (другими словами, с помощью +, -, *, / и % операторы). Возможно ли сделать это таким образом?

Я просто не могу понять, как извлечь первую цифру от переменной длины номер без использования таких вещей, как log10, условия, "в то время как" цикл или преобразование строк.

7 ответов


Edit: теперь проверено на 0 и 100:

var result = n / 10 * (1 - n / 100) + n / 100 + (109 - n) / 100 * n;

Как работает:

n        | n / 10 * (1 - n / 100) | n / 100 | (109 - n) / 100 * n
-----------------------------------------------------------------
10 - 99  | 1 - 9                  | 0       | 0
-----------------------------------------------------------------
100      | 0                      | 1       | 0
-----------------------------------------------------------------
0 - 9    | 0                      | 0       | 0 - 9


без каких-либо условий:

int H= N / 100;       // Hundreds digit
int T= (N / 10) % 10; // Tens digit
int U= N % 10;        // Units digit

int h= H;                      // Hundreds flag
int t= (T + 9) / 10 * (1 - h); // Tens flag
int u= (1 - t) * (1 - h);      // Units flag

int Answer= u * U + t * T + h * H; // Combination

используйте цикл while и продолжайте делить входной номер на 10, пока мы начинаем со значения больше больше или равно 10. Когда модифицированный вход меньше десяти, это означает, что мы сняли все цифры справа, за исключением "первой" цифры.

int input = 100;

while (input >= 10)
{
    input /= 10;
}

Console.WriteLine("First digit is: {0}", input);

демо


это не общий ответ и работает только потому, что домен ограничен. Идея состоит в том, чтобы вернуть все цифры (сто, десять и один) вместе."Некоторые мысли о конкретных диапазонах чисел:

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

Я пытался решить дело, но безуспешно, Я могу найти только первую цифру, если N равно 1-100. Вот мой исходный код. Надеюсь, это поможет https://dotnetfiddle.net/6XyOfd


static int Result(int input)
{
    return input/100 + (input%100/input)*input/10 + (input%10/input)*input;
}
  • input/100 возвращает 1, если и только если input равно 100, иначе 0
  • (input%100/input) возвращает 1, если и только если input < 100, иначе 0
    • если input ниже 10,input/10 будет 0
  • (input%10/input) возвращает 1, если и только если input < 10, else 0

осторожностью

это сломалось бы, если input == 0 см. @quanik это для обработки 0.

тем не менее, он будет работать для 1-999.


if (N < 10)
  Output(N)
else if (N < 100)
  Output(N / 10)
else
  Output(1)