Java 中的 “鸭子数”(Duck Numbers)

鸭子数是指这样一种正整数:其内部包含数字 “0”,但数字的首位不能是 “0”。例如,10305、20050 和 603 都是鸭子数;而 0349 和 2987 则不是鸭子数 —— 因为 0349 以 “0” 开头,2987 内部则不包含任何 “0”。

在 Java 中,判断鸭子数有以下几种方法:

  • 使用 while 循环
  • 使用 contains () 方法

下面我们来详细了解每种方法的实现逻辑。

方法一:使用 while 循环判断鸭子数

此方法中,我们先获取输入的数字,然后从数字的末尾开始,通过取余运算符(%)和除法运算符(/)遍历其每一位数字,检查是否存在 “0”。若找到 “0”,则该数字为鸭子数。

实现步骤

按照以下步骤,使用 while 循环判断一个数字是否为鸭子数:

  1. 将数字作为字符串输入:选择字符串类型接收输入,是因为若以整数类型接收,Java 可能会将以 “0” 开头的数字(如 0523)当作八进制数处理,进而导致计算错误。
  2. 检查首位是否为 “0”:若数字的首位是 “0”,直接返回 “不是鸭子数”(false)。
  3. 从末尾遍历数字,检查是否包含 “0”:通过 “数字 % 10”(取余)获取当前末尾数字,再通过 “数字 / 10”(整除)去掉当前末尾数字,依次循环。若遍历过程中找到 “0”,则返回 “是鸭子数”(true);若遍历结束仍未找到 “0”,则返回 “不是鸭子数”(false)。

实现代码

以下是使用 while 循环判断鸭子数的 Java 代码:

import java.util.*;
public class ducknumber {
   public static boolean checkducknum(String number) {  
      if (number.charAt(0) == '0') {
         return false;
      }
      int num = Integer.parseInt(number);
      while (num != 0) {  
         if (num % 10 == 0)  
            return true;   
         num = num / 10;  
      }  
      return false; 
   }   
   public static void main(String args[]) {     
      String n = "1004"; 
      if (checkducknum(n))   
         System.out.println(n + " 是鸭子数");   
      else  
         System.out.println(n + " 不是鸭子数");   
   }
}

输出结果

时间复杂度

该代码的时间复杂度为 O (n),其中 n 是该数字的位数。

方法二. 利用 contains () 方法判断鸭子数

使用字符串的 contains() 方法可以进一步简化上述代码。我们可以直接通过该方法判断数字(以字符串形式表示)是否包含 “0”,这样写出的代码会更加简洁精炼。

实现代码

以下是使用 contains () 方法判断鸭子数的 Java 代码:

import java.util.*;
public class ducknumber {
   public static boolean checkducknum(String number) {  
      if (number.charAt(0) == '0') {
         return false;
      }
      return number.contains("0");
   }   
   public static void main(String args[]) {     
      String n = "01004"; 
      if (checkducknum(n))   
         System.out.println(n + " 是鸭子数");   
      else  
         System.out.println(n + " 不是鸭子数");   
   }  
}

输出结果

时间复杂度

该代码的时间复杂度为 O (n)

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容