/** * 输出N以下所有的素数 一般方法 时间复杂度 O(n*n) * 质数除了1和本身之外没有其他约数,所以判断n是否为质数,根据定义直接判断从2到n-1是否存在n的约数即可 * * @param N */ public static void method_1(int N) { int i, j; boolean flag = true; for (i = N; i > 1; i--) { for (j = i - 1; j > 1; j--) { int temp = i%j; if (0 == temp) { flag = false; break; } } if (flag) { System.out.print(i + " "); flag = true; } } } /** * 输出N以下所有的素数 改进 时间复杂度 O(n*sqrt(n)) * <p> * 对于每个数n,其实并不需要从2判断到n-1,一个数若可以进行因数分解, * 那么分解时得到的两个数一定是一个小于等于sqrt(n), * 一个大于等于sqrt(n),据此,上述代码中并不需要遍历到n-1, * 遍历到sqrt(n)即可,因为若sqrt(n)左侧找不到约数,那么右侧也一定找不到约数 * * @param N */ public static void method_2(int N) { int i, j; boolean flag = true; for (i = N; i > 1; i--) { int tam = (int) Math.sqrt(i); for (j = tam; j > 1; j--) { if (0 == i % j) { flag = false; break; } } if (flag) { System.out.print(i + " "); flag = true; } } } /** * 输出N以下所有的素数 吵超级改进 时间复杂度 O(n*sqrt(n)/2) * 质数分布的规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等 * 将大于等于5的自然数表示如下: * ······ 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ······ * <p> * 非和6的倍数相邻立即排除 * * @param N */ public static void method_3(int N) { int i, j; boolean flag = true; for (i = N; i > 1; i--) { if (2 == i || 3 == i) { System.out.print(i + " "); continue; } if (i % 6 != 1 || i % 6 != 5) { continue; } int tam = (int) Math.sqrt(i); for (j = tam; j > 4; j--) { if (0 == i % j) { flag = false; break; } } if (flag) { System.out.print(i + " "); flag = true; } } }
面试题:输出N以内所有的素数,N是一个正整数
最新推荐文章于 2024-05-24 15:31:40 发布