这个方式是检查一个数是不是质数的
private boolean isPrime(int n) {
for (int i = 2; i * i <= n; i++) {
if (n % i == 0)
return false;
}
return true;
}
参数n为任意一个整数,检查这个数是否为质数i = 2: 是从2开始,因为质数可以被1整除
n % i == 0: return false,是说整除为0就不是整数,返回最不理解的是那循环条件,为什么可以这样写 i*i <= n请各位解释下,我很菜....
private boolean isPrime(int n) {
for (int i = 2; i * i <= n; i++) {
if (n % i == 0)
return false;
}
return true;
}
参数n为任意一个整数,检查这个数是否为质数i = 2: 是从2开始,因为质数可以被1整除
n % i == 0: return false,是说整除为0就不是整数,返回最不理解的是那循环条件,为什么可以这样写 i*i <= n请各位解释下,我很菜....
解决方案 »
- java中JFrame类中 公共方法调用
- 泛型方法的小问题
- 关于java多线程编程,CPU使用率一直是100%的问题
- 跪求!!!Hibernate中的一些概念 在线等!!!!!!!!!!!!!!!
- 急!急!急!路由器上LS选路算法和DV选路算法的实现!高手进啊!
- jfreereport 的标题问题
- java多线程聊天,两个客户端通过服务端转发消息实现通信,可是为什么信息发不出去,?以下客户端和服务端
- 找工作必看的,一定别上当了
- [求助]JBuilder中引用问题(初级)
- 如何在AWT Panel中画200个小方块,并能定位每个方块的坐标???急
- 谁来帮我完善所有的功能
- 怎样做到在小程序中 做到输入的数字 是纵排列的 改为是加“《《”的 行排列 下面有个帮忙看看
具体描述一下:假设 N 从2到根号N都没有它的因数,而他有一个因数是m并且是大于根号N,很显然有:N/m = n(一个整数),由于m>根号N,n<根号N 这说明N从2到根号N有它的因数,与假设相反(即返回false)
ps~~你上面提到的“ i*i <= n ”,其实就是求出根号N的值,写法不同而已!
再PS~~素数的准确公式到目前仍在研究中,目前数学家也没有最准确的算法,只是近似的。。
希望对你有帮助!
如果再判断n的平方根后面的数 循环就重复了.. 例如说
你判断20是不是质数, 20的平方根大约是2*2.236的话,循环从i=2开始,,判断2.3.4的情况,再往上判断的话就多余了阿, 到6=2*3,8=2*4, 其实我也不太明白这里面是怎么处理的..只是当时上学的时候学的一个什么定理..当定理记住了.呵呵
谢谢你的分析,我差不多懂了,
private boolean isPrime(int n) {
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0)
return false;
}
return true;
}
可以写出这样的,打个比方,n为20 平方根的整数为4只要循环到4就可以了,因为循环到8,12是在做无用功,8,12是4的倍数
如果一个数能表示成a*b
则一定有a<=sqrt(a*b)||b<=sqrt(a*b)成立