Найти первую цифру числа, используя ТОЛЬКО целочисленные операции - PullRequest
0 голосов
/ 25 сентября 2018

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

Учитывая число N (0 <= N <= 100), найдите его <strong>первую цифру.

Например:

input: 100
result: 1

input: 46
result: 4

input: 3
result: 3

Сначала это казалось простым, но (как сказал учитель) это должно быть сделано с использованием ТОЛЬКО целочисленных типов данных (другими словами, используя операторы +, -, *, / и %).Можно ли вообще так сделать?

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

Ответы [ 7 ]

0 голосов
/ 25 сентября 2018

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

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)));
0 голосов
/ 25 сентября 2018

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

0 голосов
/ 25 сентября 2018
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, иначе 0

Внимание

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

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

0 голосов
/ 25 сентября 2018

Редактировать: Теперь проверено на 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

0 голосов
/ 25 сентября 2018

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

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
0 голосов
/ 25 сентября 2018
if (N < 10)
  Output(N)
else if (N < 100)
  Output(N / 10)
else
  Output(1)
0 голосов
/ 25 сентября 2018

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

int input = 100;

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

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

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...