-
直接将统计的素数写入循环,可以从2开始,判定2到要判定的数减1是否有数能被整除,若没用,为素数,若有,则不是
-
public static int bf(int n){ int count = 0; for(int i = 2; i < n; i++) { count += isPrime(i) ? 1 :0; // 判定当前数值是否为素数,是返回1,不是则为0 } return count; } private static boolean isPrime(int x) { for(int i = 2; i < x; i++) { if(x % i == 0) // 判定从2到x-1是否有数可以被x整除,如果有则不是素数,返回false { return false; } } return true;//如果没有则为素数,返回true }
-
但在判定过程中,可以不用从2遍历到x-1,遍历到根号x即可,原因如下
- 如果要判定12是否为素数,那么12,可以分为2 * 6 , 3 * 4,4 * 3,6 * 2,但只要判断完2 *6,那么说明这个数已经不是素数了,所以后续的6 * 2也就不用去判断了,3 * 4同理,所以上面的代码可以改为
-
private static boolean isPrime(int x) { for(int i = 2; i * i < x; i++) // 将i 改为 i*i { if(x % i == 0) // 判定从2到根号x是否有数可以被x整除,如果有则不是素数,返回false { return false; } } return true;//如果没有则为素数,返回true }
-
c代码同理如下
-
#include <stdio.h> int main(int argc, char const *argv[]) { int sun; int count = 1; int a; scanf("%d",&a); int i = 2,j = 2; for(i = 2; i < a; i++) { for(j = 2;j < i; j++) { if(i % j == 0) { count = 0; break; }else{ count = 1; } } sun += count; } printf("%d",sun); return 0; }