这是我在CodeReview网站上找到的功能,它确定一个数字是否为素数,同时也处理负数。我无法真正追上的东西很少。
1)当它应该处理否定时,为什么第一个条件<= 3
?
2)return n > 1
实际返回什么?它以任何方式影响其他条件吗?
bool IsItPrime(int n)
{
if(n <= 3) {
return n > 1;
} else if(n % 2 == 0 || n % 3 == 0) {
return false;
} else {
for(int i(5); i * i <= n; i += 6) {
if(n % i == 0 || n % (i + 2) == 0) {
return false;
}
}
return true;
}
}
答案 0 :(得分:1)
if(n <= 3) {
return n > 1;
}
如果不是最容易推理的东西,那就很聪明。首先,如果您的数字为3或更少,则输入if正文。这包括前2个素数加上所有负数0和1.然后它继续到return n > 1;
这意味着如果n
大于1
,则返回true,否则假。因此,如果n
为2
或3
,则该函数将返回true
。它小于2
,然后返回false
。它与
if (n <= 1) return false;
else if (n == 2 || n == 3) return true
else if ...
但是你可以看到更多的输入并添加一个if语句。
答案 1 :(得分:1)
根据维基百科:
素数(或素数)是大于1的自然数
@Provider
@Priority(Priorities.USER)
public class ResponseLogFilter implements ContainerResponseFilter{
private Logger logger = LoggerFactory.getLogger(ResponseLogFilter.class);
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
try {
Instant end = Instant.now();
Instant start = (Instant) requestContext.getProperty(RequestContextLoggingFilter.REQUEST_START_TIME);
logger.info("Done executing request with request_execution_time={} ms",
Duration.between(start, end).toMillis());
}catch (Exception e){
logger.warn("error logging response time", e);
}
}
}
表示对于大于1的任何数字都返回true(即2或3,因为它出现在测试return n > 1
之后)。 0,1或负数会使其返回false。
答案 2 :(得分:0)
1)为什么第一个条件&lt; = 3应该处理它 底片? 2)什么返回n&gt; 1实际上返回? 这些问题是相互关联的:
该函数可以采用否定参数,但正如您可以看到第一组条件测试参数是否在1和3之间.2,3是素数,如果参数为1,0或者它将返回true或者否定,它将返回false(因此它与负数无关)。
答案 3 :(得分:0)
if(n <= 3) {
return n > 1;
}
除了2和3之外,对于所有小于或等于3的数字,这将返回false。这也处理负数(任何负数都将小于3)。
else if(n % 2 == 0 || n % 3 == 0) {
return false;
}
这会对您的参数执行模运算,如果该数字可以被2或3整除(这也会使其不是素数),则返回false。我们可以安全地称之为即使2和3是可分的,因为它们是在上面处理的。
else {
for(int i(5); i * i <= n; i += 6) {
if(n % i == 0 || n % (i + 2) == 0) {
return false;
}
}
return true;
}
它通过循环处理所有其他数字,直到你高于数字的平方根。它也进行模数运算,这次是5,7,并且所有值都是n + 6,n + 8(&lt; 11,13&gt;,&lt; 17,19&gt;等)。我们可以迭代6,因为我们正在进行上面的2和3模数运算。