求最大公约数
public static int gcd(int a, int b) {
if((b == 0)) return a;
return gcd(b, a % b);
}
判定是否为素数
public boolean is_prime(int n) {
for(int i = 2; i * 1 <= n; i++) {
if(n % i == 0) return false;
}
return n != 1;
}
如果a是n的约数,那么n/a也是n的约数。由n=d*n/d可知min(d,n/d)<=根号n,所以检查2~根号n的所有整数就足够了
埃氏筛法
求n以内有多少个素数
埃氏筛法的思想:首先将2到n的所有整数写下来,其中2是最小的数,也是素数,将所有2的倍数去掉,因为他们可以被2整除;剩下3是最小的数,因为没有更小的整数可以整它,所以同时它也是素数,去掉所有3的倍数;如果剩下一个最小的m,m就是素数,然后将所有m的倍数去掉。
public static int prime_num(int n) {
int[] primes = new int[n]; //定义一个存放素数的数组
boolean[] is_prime = new boolean[n + 1]; //如果n是素数那么is_prime[n] = true
int num = 0;
/*初始化*/
for(int i = 0; i <= n; i++) is_prime[i] = true;
is_prime[0] = false; is_prime[1] = false;
/*如果i 是素数那么去掉所有i的倍数*/
for(int i = 2; i <= n; i++) {
if(is_prime[i]) {
primes[num++] = i;
for(int j = 2; j * i <= n; j++) is_prime[j * i] = false;
}
}
return num;
}