【问题标题】:Checking if number is ugly检查数字是否丑陋
【发布时间】:2015-12-18 03:43:18
【问题描述】:

我正在做这个问题:

编写一个程序来检查给定的数字是否是丑数。

丑数是正数,其质因数仅包括 2、3、5。例如,6、8 丑陋,而 14 不丑,因为它包含另一个质因数 7。

请注意,1 通常被视为丑数。

这是我的尝试:

public class Solution {
    public boolean isUgly(int num) {
        if (num == 1) {
            return true;
        }
        for (int i = 7; i <= num / 2; i++) {
            if (isPrimeFactor(i, num)) {
                return false;
            }
        }
        return true;
    }

    public boolean isPrimeFactor(int candidate, int num) {
        return isPrime(candidate) && isFactor(candidate, num);
    }

    public boolean isPrime(int num) {
        if (num == 2) {
            return true;
        }
        if (num % 2 == 0) {
            return false;
        }
        for (int i = 3; i <= Math.sqrt(num); i += 2) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }

    public boolean isFactor(int candidate, int num) {
        return (num % candidate == 0);
    }
}

不幸的是,它在测试输入 -2147483648 上失败。它应该为假时返回真。

知道我做错了什么吗?

【问题讨论】:

  • 通过调试器运行您的代码并告诉我们自己

标签: java


【解决方案1】:

您只是忘记了以下强调的条件:

丑数是正数,其质因数只有2、3、5。

因此,您只需在 isUgly 方法中添加一个负数检查:

if (num <= 0) {
    return false;
}

附带说明,您可以通过交换isPrimeFactor 中的条件并测试isFactor(candidate, num) &amp;&amp; isPrime(candidate) 而不是isPrime(candidate) &amp;&amp; isFactor(candidate, num) 来稍微提高性能。这是因为判断一个数是否是另一个数的因数比判断一个数是否是素数要快。

【讨论】:

    【解决方案2】:

    我可以针对这个问题提出一个不同但更快的解决方案 O(logn):

    public static boolean isUgly(int num) {
        if (num < 1) return false;
    
        int temp;
        do {
            temp = num;
            if (num % 2 == 0) num /= 2;
            if (num % 3 == 0) num /= 3;
            if (num % 5 == 0) num /= 5; 
        } while (temp != num);
    
        return num == 1;
    }
    

    或者在模块化检查方面更快的方法(通过拆分 do while 循环):

    public static boolean isUgly(int num) {
        if (num < 1) return false;
    
        int temp;
        do {
            temp = num;
            if (num % 2 == 0) num /= 2;
        } while (temp != num);
        do {
            temp = num;
            if (num % 3 == 0) num /= 3;
        } while (temp != num);
        do {
            temp = num;
            if (num % 5 == 0) num /= 5;
        } while (temp != num);
    
        return num == 1;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-06-11
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      相关资源
      最近更新 更多