本帖最后由 jackz007 于 2021-11-28 12:22 编辑
本代码判断素数采用的是排除法,对于每一个 i,先假定它是一个素数,置 flag = 1,然后,在 2 ~ i / 2 的范围内,循环枚举它可能的因子 j,测试 i % j 的余数,如果余数为 0 了,那就说明 j 是 i 的因子, i 就不是一个素数,于是,否定前期 i 是素数的假设,置 flag = 0,结束对 i 的判断;反之,如果在 2 ~ i / 2 的范围内,居然没有一个 j 能使 i % j == 0,那么,说明开头的假设成立,i 确实是一个素数。
本代码总体由两个循环嵌套构成,第 1 个 for 是为了在 5 ~ 9999 的范围内,枚举出每一个整数 i,而第 2 个 for 是为了在 2 ~ i / 2 的范围内,循环枚举出 i 所有可能的因子 j ,并挨个测试 i % j 的余数是否为 0。所以, i 是否是素数是在第 2 个 for 中做出判断的,这就是第 2 个 for 存在的作用和价值。
因为乘法满足交换率,所以,枚举 j 的范围可以进一步缩小到 sqrt(i) 像这样
- for(i = 5 ; i < 10000 ; i ++) {
- for(j = 2 ; j * j < i + 1 ; j ++) {
复制代码
此外,除了 2,所有的素数都是奇数,所以,还可以免去对所有偶数的判断,这样,运算效率会提升一倍。
- for(count = 0 , i = 3 ; i < 10000 ; i ++) {
- flag = 0 ;
- if(i % 2) {
- for(flag = 1 , j = 3 ; j * j < i + 1 ; j += 2) {
- if(! (i % j)) {
- flag = 0 ;
- break ;
- }
- }
- }
- if(flag) count ++ ;
- }
复制代码