我试图写一个函数来确定一个数字是否是"丑陋"。对于一个数字来说,#丑陋",它必须没有除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。这里有可能出现溢出吗?我已经查看了我的代码,逻辑看起来对我来说......
谢谢!
答案 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
素数。
所以我相信你对它应该是假的期望是不正确的 - 但这取决于作业对负数的素因子的定义。
备注:强>
isPrime(num)
而不是isPrime(i)
,因此它将始终返回true。 num
i
不能同时被num
整除,而是同时处于素数。将程序限制为stations : [
{call:'station one',frequency:'000'},
{call:'station two',frequency:'001'}
]
的平方根是错误的。例如,取数字881305274.其主要因素是2和440652637.但440652637比sqrt(881305274)大得多。平方根技巧适用于素数测试,因为任何大于根的因子都必须乘以小于根的因子。但这并不适用于“丑陋”的问题。
此外,素数不被视为“丑陋”,因为它们是自身的一个因素。但是你的程序,因为它将自己限制在平方根,对于素数永远不会返回false。