2011-03-25 31 views
0

我有一些int值,它的名字是number。我有其他的int值,它的名字是x。我想知道是否x存在于number或不存在。目前我将数字转换为string()并使用string.Contain(x)方法。我认为这不是一个好方法,它的拳击和表演受到伤害。如何检查int中是否存在数字?

有没有更好的方法来做到这一点?

附加信息: number可能是一个或多个数字,例如12345. x总是一位数字。

+0

请举例。数字总是单个数字吗?实际上'x'是字符串表示中的一个整数,还是可能是多个数字(例如,逗号分隔)? – 2011-03-25 07:53:00

+0

将'int'转换为'string'不是装箱。你怎么确定'int'到'string'的转换是瓶颈? – 2011-03-25 07:53:15

+0

这个方法看起来和任何假设一样好,通过“contains”,你的意思是一个数字的字符串版本出现在另一个数字的字符串版本中。 – 2011-03-25 07:55:59

回答

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 

因为你,如果你在一个0通过number和你还有没有进入while第一if是必需的以捕获numberdigit均为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. 
} 
+1

然后再一次,有多少个算术计算可以匹配多少个字符串比较? ......我现在闭嘴:) – BoltClock 2011-03-25 07:58:19

+0

而这正是关于极限性能的重要因素:) – fjdumont 2011-03-25 08:08:41

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; 
} 
2

不,它不使用拳击,但它确实创建了对象。

使用字符串是一个很好的解决方案,除非你需要非常卓越的性能,否则你应该坚持下去。

你可以用数字解决它。然后,您首先需要找出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; 
}