求最大公約數、求素數最優雅解法

求最大公約數

	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;
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章