Java:保理时输出不正确

时间:2015-08-22 14:04:24

标签: java

我试图写一个函数来确定一个数字是否是"丑陋"。对于一个数字来说,#丑陋",它必须没有除2,3或5之外的素数因子。

这是我的尝试:

public class Solution {

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

public boolean isUgly(int num) {
    if (num < 0) {
        num *= -1;
    }
    for (int i = 7; i <= Math.sqrt(num); i += 2) {
        if ((num % i == 0) && isPrime(num)) {
            return false;
        }
    }
    return true;
}

}

当输入= -2147483648时,我应该为false。这里有可能出现溢出吗?我已经查看了我的代码,逻辑看起来对我来说......

谢谢!

2 个答案:

答案 0 :(得分:3)

问题是Integer.MIN_VALUE*-1 = Integer.MIN_VALUE导致Math.sqrt(Integer.MIN_VALUE)返回NaN的负数,因此当您执行此操作7 <= Math.sqrt(Integer.MIN_VALUE)时,它返回false,甚至不返回输入for循环,导致程序返回true。

我希望这个解释有所帮助。

答案 1 :(得分:0)

在这样的问题中,负数很棘手。

你必须取绝对数并考虑它。在您的原始来源中,您没有这样做。这意味着您从NaN方法获得Math.sqrt。这也意味着当你将它与7进行比较时你会变得虚假。

因此,对于所有负数,原始方法都会返回true

但改变符号(顺便说一下,可以通过num = -num完成而不是乘法),这将解决所有负数,实际上引入了溢出到程序中

实际上,-2147483648的数字是-2 31 int中允许的最大正数为2 31 -1。所以数字- Integer.MIN_VALUE总是溢出......本身。否定后它仍然是负面的!

所以你再次遇到NaN

但是请注意 - 因为数字是-2 31 ,事实上,除了2之外,它实际上没有任何其他素数因子。所以该方法确实应该返回true它 - 假设你没有考虑-1素数。

所以我相信你对它应该是假的期望是不正确的 - 但这取决于作业对负数的素因子的定义。

备注:

  1. 您的程序会检查isPrime(num)而不是isPrime(i),因此它将始终返回true。 num i不能同时被num整除,而是同时处于素数。
  2. 将程序限制为stations : [ {call:'station one',frequency:'000'}, {call:'station two',frequency:'001'} ] 的平方根是错误的。例如,取数字881305274.其主要因素是2和440652637.但440652637比sqrt(881305274)大得多。平方根技巧适用于素数测试,因为任何大于根的因子都必须乘以小于根的因子。但这并不适用于“丑陋”的问题。

    此外,素数不被视为“丑陋”,因为它们是自身的一个因素。但是你的程序,因为它将自己限制在平方根,对于素数永远不会返回false。