判断100以内的质数(素数)

public class Demo3 {

    public static void main(String[] args) {

        boolean b;
        for (int i = 2; i < 100; i++) {    //遍历2-100的所有数
            b = true;
            int k = (int) Math.sqrt(i);    //开平方
            for (int j = 2; j <= k; j++) {

                if (i % j == 0) {        

                    b = false;
                    break;
                }
            }
            if (b) {
                System.out.println(i);
            }

        }
    }
}

在这里,有2个关键的变量,我估计解释一下你就能看得明白这个算法了.
1.关于变量k.变量k的作用是优化整个算法,因为比如要判断一个数13是不是素数,我们没必要从2循环到13.只要循环到对13开根号.13开根号大概是3.6多,强转为int类型后是3.也就是说只要检查2,3是否能整除13.如果不能,13肯定是一个素数.因为比如48这个数,你前面检测到被4整除等于12,那么继续循环超过Math.sqrt(48)的话,无非就是得到一个反过来的被12除等于4的结果.这个没有必要.

2.关于变量j.注意点1:j是在最外层的循环体中定义的.这个时候刚定义完,j的值是初始的0.然后j从2开始,一直到小于等于k结束.这里是控制尝试整除的循环次数.一旦发现在这个范围内有数能整除i,那么就跳出循环.

所以,对于你不理解的那个部分,首先确定一点,程序只要执行到break,就说明这个数是素数.
例如我们这次k = 10,那么是要从j = 2到10逐一检测 i 是不是能被 j 整除.当j = 7的时候比如可以整除了,就跳出当前内层循环了.这时候, j 显然是不大于 k 的,因为只要是中途跳出,因为内层循环(j = 2; j <= k; j++)的控制,只要在循环过程中跳出来的,那么j 肯定 <= k.

只有循环到j = 10依然没有break的话,根据for循环的执行顺序,会执行j++,然后去判断j <= k 是否为true,为true则继续下一次循环,否则循环结束.而在这里,如果到10还没有能够整除的话,j是会在10的基础上自增的.这时候j就=11了.

那么if ( j > k )就不成立了,则i 不会被输出.

总结一点:就是如果中途or最后一次循环,找到能整除的数了,那么因为break的关系,最后就不会执行 j++, 所以j <= k的条件是能保证的. 换言之,如果j > k (亦即j <= k 的取反)表示没有找到能整除的数.其实j最大也就只能等于k+1.

时间: 2024-10-22 04:27:35

判断100以内的质数(素数)的相关文章

【Python实践-7】输出100以内的所有素数

1 #输出100以内的所有素数,素数之间以一个空格区分(注意,最后一个数字之后不能有空格). 2 i=2 3 l=[] 4 while i<100: 5 k=0 6 for j in range(2,i): 7 if i%j==0: 8 k=k+1 9 if k==0: 10 l.append(i) 11 i=i+1 12 print(" ".join(str(i) for i in l)) 知识点: 1.素数,又称质数,定义为在大于1的自然数中,除了1和它本身以外不再有其他因数

JavaScript 斐波那契数列 倒序输出 输出100以内的质数

|--斐波那契数列 1 //求斐波那契数列第n位 2 var n = parseInt(window.prompt('输入你要求的斐波那契数列的位数')); 3 var first = 1, 4 second = 1, 5 third; 6 if (n > 2) { 7 for (var i = 0; i < n - 2; i++) { 8 third = first + second; 9 first = second; 10 second = third; 11 document.writ

求100以内的质数

求100以内的质数. 1 num = [2] 2 i = 3 3 while i < 101: 4 j = 2 5 while j < i: 6 if i % j == 0: 7 break 8 else: 9 j = j + 1 10 continue 11 else: 12 num.append(i) 13 i = i + 1 14 print(num)

C语言打印100以内的质数

C语言打印100以内的质数 #include <stdio.h> int main() { int number; int divisor; for( number = 3; number <= 100; number += 2 ) { for( divisor = 3; divisor <= number; divisor += 2 ) { if( number % divisor == 0 ) break; } if( divisor == number ) printf(&q

打印100以内的质数

#include<stdio.h> #include<stdlib.h> int is_zs(int a); int main(void) { int i; int count = 0; for(i = 1; i <= 100; i++) { if(is_zs(i)) { printf("%d\t", i); count++; if(count % 5 == 0) { printf("\n"); } } } return EXIT_SU

找出100以内的质数并求和

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int a = 0; for(int s=0;s<=100;s++) { int num = 0;//记

求解100以内的所有素数(问题来自PythonTip)

求解100以内的所有素数 (AC/Submit)Ratio(4615|22542)20.47% 描述: 输出100以内的所有素数,素数之间以一个空格区分(注意,最后一个数字之后不能有空格). a=[2] for i in range(3,101): flag=0 for j in range(2,i): if(i%j==0): flag=1 if(flag==0): a.append(i) print(' '.join(map(str,a))) //语句内得加一个括号,切记 原文地址:https

python ---求100以内的质数有哪些

#coding=utf8 #求100以内的质数有哪些 #质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数 #for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况下执行,while - else 也是一样. list = [] def f(n): for i in range(2,101): #如果for循环中存在一个满足这个条件,直接break跳出for循环,不执行else #如果for循环中没有一个满足该条

PHP面试题之实现输出100以内的质数

最近求职时的其中一道面试题: 求100之内的质数 <? //求100以内质数 for ($i = 1; $i <= 100; $i++) { $k = 0; for ($j = 1; $j < $i; $j++) { if ($i % $j == 0) { $k++; } } if ($k == 1) { echo $i; echo "  "; } } ?>