Как проверить, существует ли номер в int? - PullRequest
0 голосов
/ 25 марта 2011

У меня есть некоторое значение типа int, его имя number. У меня есть другое значение int его имя x. Я хочу знать, существует ли x в number или нет. В настоящее время я конвертирую число в string () и использую метод string.Contain (x). Я думаю, что это не очень хороший способ, он делает бокс и производительность ухудшается.

Есть ли лучший способ сделать это?

Дополнительная информация: number может быть одной или несколькими цифрами, например, 12345. x всегда одна цифра.

Ответы [ 3 ]

3 голосов
/ 25 марта 2011

Это неплохой метод. Единственная альтернатива, о которой я могу подумать, это что-то, использующее повторяющиеся деления и операторы модулей, которые могут быть медленнее из-за количества этих операций.

Я бы придерживался того, что у вас есть, если только нет серьезной проблемы с производительностью.


На основании вашей дополнительной информации:

number может быть одной или несколькими цифрами, например, 12345. x всегда является одной цифрой.

Я бы выбрал следующее (псевдокод):

def numContains (number, digit):
    if number == 0 and digit == 0:
        return true
    while number != 0:
        if number % 10 == digit:
            return true
        number = number / 10
    return false

Первый if обязателен, поскольку вы не вводите while, если вы передаете number из 0, и вам все равно нужно поймать случай, когда оба значения number и digit 0.

В противном случае вы просто продолжаете проверять младшую значащую цифру number против digit и делите number на 10 каждый раз.

Если совпадение найдено до того, как number достигнет нуля, оно содержит цифру. В противном случае это не так.

Это, вероятно, будет быстрее, чем ваше строковое решение, поскольку ему придется выполнять аналогичные операции, чтобы создать строку из целого числа, а затем выполнить сравнение строки поверх этого.

Но, как и во всех оптимизациях, измерьте, не угадайте!


И теперь, когда у меня есть доступ к моему блоку разработки VS2008, у нее есть код C # для него:

// Function: containsDigit, returns whether non-negative number holds a digit.
//       In: num, the integer to check.
//           dgt, the digit to look for.
//      Out: Boolean representing whether digit found in number.
//    Notes: Digit is coerced to a single digit.

Boolean containsDigit(UInt32 num, UInt32 dgt) {
    dgt = dgt % 10;                // silently force contract compliance.
    if ((num == 0) && (dgt == 0))  // Zero contains zero.
        return true;
    while (num != 0) {             // While more digits in number.
        if ((num % 10) == dgt)     // Return true if rightmost digit matches.
            return true;
        num = num / 10;            // Get next digit into rightmost position.
    }
    return false;                  // No matches, return false.
}
2 голосов
/ 25 марта 2011

Нет, он не использует бокс, но создает объекты.

Использование строк - довольно хорошее решение, и если вам не нужна действительно исключительная производительность, вам следует просто придерживаться ее.

Вы можете решить это численно. Затем вам сначала нужно выяснить, сколько цифр в x, чтобы вы могли использовать модуль по маске для маскировки части number. Затем вы можете проверить и проверить различные части number для x:

int mask = 10;
while (mask <= x) mask *= 10;
bool found = false;
while (number >= mask) {
  if (number % mask == x) {
    found = true;
    break;
  }
  number /= 10;
}
1 голос
/ 25 марта 2011

Если x однозначный:

for (int n = number; n > 0; n /= 10)
{
    int digit = number % 10;
    if (digit == x) return true;
}

Если х многозначный:

int xd = 0;
for (y = x; y > 0; y /= 10) xd++;

for (int n = number; n > 0; n /= 10)
{
    int digit = number % xd;
    if (digit == x) return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...