有人可以彻底解释这个IsItPrime功能吗?

时间:2018-03-12 15:18:34

标签: c++ primes

这是我在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;
    }
}

4 个答案:

答案 0 :(得分:1)

if(n <= 3) {
    return n > 1;
}

如果不是最容易推理的东西,那就很聪明。首先,如果您的数字为3或更少,则输入if正文。这包括前2个素数加上所有负数0和1.然后它继续到return n > 1;这意味着如果n大于1,则返回true,否则假。因此,如果n23,则该函数将返回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模数运算。