求最大公約數
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;
}