有关素数的疑问

来源:百度知道 编辑:UC知道 时间:2024/05/03 10:08:11
public class TestSuShu{
static int num;
public static void main(String[] args) {
for (int i = 101; i < 200; i++) {
int j;
int k=(int)(Math.sqrt((double)i)+1);//为什么里面要加1
for (j = 2; j <k; j++){
if (i % j == 0) {
break;
}
}

if ( j >(int)(Math.sqrt(i))) {//为什么此处要做这样的判断,为什么这里面不要加1了

num++;

}
}
System.out.println();
System.out.println("素数的个数为:"+num);

}
}
请各位能详细的讲解一下我的疑问。还有没有更简便的写法,请回答我一下,呵呵,谢谢

》》int k=(int)(Math.sqrt((double)i)+1);//为什么里面要加1
这一行之后的 for 循环的目的是检查 i 是否能被任何等于或大于 2 但小于或等于 (int) Math.sqrt(i) 的整数整除(注:多余的 “(double)” 被去掉了)。该 for 循环的条件表达式被编成 j < k,即循环持续到 j == k - 1 为止,不包括 j == k,所以如果没有那个“加 1”,程序肯定会错误地忽略对于 i 是否能被 (int) Math.sqrt(i) 整除的检查。
如果该 for 循环的条件表达式被改成 j <= k,那个“加 1”就没必要了。

》》if ( j >(int)(Math.sqrt(i))) {//为什么此处要做这样的判断,为什么这里面不要加1了
这一句的目的是判断内部 for 循环的结束是否因为 j < k 不再为真(若是,则 i 没有被任何等于或大于 2 但小于或等于 (int) Math.sqrt(i) 的整数整除,即 i 是素数)。这一句执行的时候,j 的值不是小于就是等于 k,不可能大于 k,也就不可能大于 (int) (Math.sqrt(i) + 1),所以如果这一句 if 判断的条件里也有“加 1”,则句中的条件总为假,程序就不对了。

》》还有没有更简便的写法?
Java 支持带标签的 break 和 continue。在这程序里利用带标签的 continue 就不再需要内部 for 之后的 if 判断了:

class C {
    public static void main(String[] args) {
        int primeCount = 0;
        next_i:
        for (int i =