检查整数是否包含零

15

给定一个整数,如何使用Java检查它是否包含数字0?

1 = 合格
2 = 合格
...
9 = 合格
10 = 不合格!
101 = 不合格!
1026 = 不合格!
1111 = 合格

如何实现呢?

7个回答

46

你的意思是判断十进制表示中是否包含0?最简单的方法是:

if (String.valueOf(x).contains("0"))

不要忘记一个数字并没有固有地包含0或不包含0(当然除了0本身)- 它取决于进制。因此,在十进制中,“10”是16进制中的“A”,而在16进制中,“10”是十进制中的“16”... 在这两种情况下,结果都会改变。

可能有更有效的方法来测试一个整数的十进制表示中是否存在0,但它们很可能比上面的表达式复杂得多。


6
如果没有人能证明以下两点,a) 这个解决方案会成为瓶颈,b) 另一个解决方案明显更快,那我会在生产代码中使用这个解决方案。简洁易读是非常重要的。+1 - Bill the Lizard

26

如果你不喜欢将值转换为字符串的解决方案,可以尝试:

boolean containsZero(int num) {
    if(num == 0)
        return true;

    if(num < 0)
        num = -num;

    while(num > 0) {
        if(num % 10 == 0)
            return true;
        num /= 10;
    }
    return false;
}

假定 num 是十进制。

编辑:添加了处理负数和零本身的条件。


1
做得好,它解决了我的问题,并且解释得很清楚。 - Muhammad Abbas

2
你可以将其转换为字符串并检查是否包含字符“0”。
int number = 101;
if( ( "" + number ).contains( "0" ) ) {
  System.out.println( "contains the digit 0" );
}

8
我非常不喜欢使用"" + x将值转换为字符串的方法。它并没有清晰地表达出意图 - 你并不是真正关心连接,而是想要进行一种转换。当然这只是我的个人看法。 - Jon Skeet
我承认,它很丑。但是非常容易记住。 - tangens
String.valueOf() 更难记吗? - whiskeysierra

2

Integer.toString(yourIntValue).contains("0");


1
这是一个可以检测整数中零的例程。为了使它能够与任何表示法(十进制、十六进制、八进制、二进制)配合使用,您需要将基数作为参数传入。
public static boolean hasZero(int num, int base) {
    assert base > 0 : "must have positive non-zero base";

    if (num == 0)
        return true;

    while(num != 0) {
        if (num % base == 0) {
            return true;
        }
        else {
            num = num / base;
        }
    }

    return false;
}

public static void main(String args[]) {
    System.out.println(hasZero(10, 10));  // true (base 10 int)
    System.out.println(hasZero(-12, 10));  // false (base 10 int)

    System.out.println(hasZero(0x10, 16)); // true (hex is base 16)
    System.out.println(hasZero(0x1A, 16)); // false (hex is base 16)
}

几乎与上面的答案重复。 - Younes

0

我不知道这是否更容易,但这里有另一种方法。 将数字拆分为整数数组。然后排序并检查第一个元素是否为零。 例如

int n = 14501;
// after splitting
int na = {1, 4, 5, 0, 1};
// after sorting
int na = {0, 1, 1, 4, 5};

-1

虽然不使用Java,但从C++转换并不难。 附言:任何人使用字符串转换都应该感到羞耻。

bool Contains0InBase10( unsigned int i, unsigned int& next )
{
 unsigned int divisor = 10;
 unsigned int remainder = 0;
 while( divisor <= i )
 {
  unsigned int newRemainder = i%divisor;
  if( newRemainder - remainder == 0)
  {
   // give back information allowing a program to skip closer to the next
   // number that doesn't contain 0
   next = i + (divisor / 10) - remainder;
   return true;
  }
  divisor *= 10;
  remainder = newRemainder;
 }
 return false;
}

1
虽然这个算法本质上可能比字符串转换更有效,但对于为什么模运算符将实现OP所寻找的功能的一点解释可能会澄清您的帖子。 - Sean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接