黑马程序员技术交流社区
标题:
求质数的疑惑
[打印本页]
作者:
吴刚
时间:
2012-11-11 18:55
标题:
求质数的疑惑
本帖最后由 吴刚 于 2012-11-11 19:01 编辑
public class LoopDemo {
public static void main(String[] args) {
for(int n = 2; n<1000; n++){
//n: 2~<1000
//如果n能够被 m:2~n/2 某个数整除.
//就忽略n, 找下一个n
int m = 2;
boolean found = false;//1
while(m<=n/2){
if(n%m==0){
found = true;//2
break;
}
m++;
}
if(!found){//3,没有找到任何整除的情况,关键就这一句
System.out.print(n +",");
}
//如果找到n就输出n
}
}
}
复制代码
句3的if后面的表达式判断为真的时候才会执行方法体,但是用boolean标记这点有点迷惑,句1所有数字标记为假,句2不是质数的为真,其他为质数,那句3的表达式不是把所求的质数又标记为true了吗?另外自己修改了一下求素数的方法。感觉更好,代码如下,关于下面的代码有一个疑问,效率是不是没有上面的高?谢谢
public class LoopDemo2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int i;
for (i=2; i<=1000; i++){//输出1-1000的素数
if(loop(i)){
System.out.print(i+",");
}
}
}
public static boolean loop(int i){//判断是否为素数
int j;
for (j=2; j<=1000; j++){
if(0 == i%j)
break;
}
if (j == i){
return true;
}else{
return false;
}
}
}
复制代码
作者:
冯纪纲
时间:
2012-11-11 20:20
其实这两个嵌套的循环,对计算机强大的计算能力而言是微不足道的,尽管的他的时间复杂度是n的平方。
楼主上面的两种方法,我测测试仪一下,第一种方法大致消耗的时间在
0~16毫秒
之间,第二种方法大致消耗的时间也在
0~16毫秒
之间。由于这代码执行的太少,看不出来什么效果,我就分别把这两种方法给执行了1000次,发现他们消耗的时间大致都在2500毫秒~4000毫秒之间。其实都差不多
我感觉楼主的方法有点麻烦,自己也想了一个方法。还有就是判断素数条件,是如果他不能够被2到这个数的平方值(就是开根号)这个区域的数整除的话,就是素数。
public static void main(String[] args) {
long start = System.currentTimeMillis();//记录代码开始执行的时间
int i, j;
for (i = 1; i <= 1000; i++) {
int key = (int) Math.sqrt(i);//开根号
for (j = 2; j <= key; j++) {
if (i % j == 0) {
break;
}
}
if (j > key) {//如果在这个区间没有被整除的话,那么这个数肯定是素数
System.out.println(i);
}
}
long end = System.currentTimeMillis();
//记录代码执行后的时间
System.out.println();
System.out.println("耗时:" + (end - start));
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2