我有一些int值,其名称为number
。我有其他int值,其名称为x
。我想知道x
中是否存在number
。目前我将数字转换为string()并使用string.Contain(x)方法。我认为这不是一个好方法,它会对拳击和表演造成伤害。
有更好的方法吗?
其他信息:
number
可以是一个或多个数字,例如12345. x
始终为一位数。
答案 0 :(得分:3)
这不是一个糟糕的方法。我能想到的唯一选择是使用重复分割和模数运算符,由于这些运算的数量可能会慢一些。
除非出现严重的性能问题,否则我会坚持使用您所拥有的功能。
根据您的其他信息:
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
的最低有效数字,并每次将number
除以10。
如果在// 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.
}
到达零之前找到匹配项,则它包含该数字。否则就不会。
这可能比你的字符串解决方案更快,因为它必须执行类似的操作来从整数创建字符串,然后在其上进行字符串比较。
但是,与所有优化一样,衡量,不要猜测!
而且,现在我可以访问我的VS2008开发盒了,她的一些C#代码:
{{1}}
答案 1 :(得分:2)
不,它不使用装箱,但它会创建物体。
使用字符串是一个非常好的解决方案,除非你需要非常出色的性能,否则你应该坚持下去。
你可以用数字解决它。然后,您首先需要找出x
中有多少位数,以便您可以使用modulo来屏蔽number
的一部分。然后,您可以循环并检查number
的{{1}}的不同部分:
x
答案 2 :(得分:1)
如果x是单个数字:
for (int n = number; n > 0; n /= 10)
{
int digit = number % 10;
if (digit == x) return true;
}
如果x是多位数:
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;
}