检查数字是否丑陋

时间:2015-12-16 20:28:25

标签: java

我正在做这个问题:

  

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

     

丑陋的数字是正数,其主要因素仅包括2,3,5。例如,6,8是丑陋而14不丑,因为它包括另一个素因子7。

     

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

这是我的尝试:

public string PlusMinus12(string hour, string minute, string second, string ampm)
    {
        string PlusMinus;
        int rndmTmp1 = Random1();
        int rndmTmp2 = Random2();

        if (rndmTmp1 == 0)
        {
            PlusMinus = hour + ":" + minute + ":" + second + ": " + ampm;
            return PlusMinus;
        }
        else if (rndmTmp1 == 1)
        {
            string temp = hour + ":" + minute + ":" + second +": " + ampm;
            **DateTime subtract = DateTime.Parse(temp);**
            subtract.AddSeconds(-rndmTmp2);
            PlusMinus = subtract.ToString("h:mm:ss tt");
            return PlusMinus;
        }
        else
        {

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

知道我做错了吗?

2 个答案:

答案 0 :(得分:2)

你忘了以下强调的条件:

  

丑陋的数字是正数,其主要因素仅包括2,3,5。

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

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

作为旁注,您可以通过交换isPrimeFactor内的条件并测试isFactor(candidate, num) && isPrime(candidate)而不是isPrime(candidate) && isFactor(candidate, num)来提高性能。这是因为确定数字是否是另一个因素比确定数字是否是素数更快。

答案 1 :(得分:1)

我可以针对这个问题提出一个不同但速度更快的解决方案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;
}