Это неплохой метод. Единственная альтернатива, о которой я могу подумать, это что-то, использующее повторяющиеся деления и операторы модулей, которые могут быть медленнее из-за количества этих операций.
Я бы придерживался того, что у вас есть, если только нет серьезной проблемы с производительностью.
На основании вашей дополнительной информации:
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.
}