Java算法——基础数学问题整理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/c_yejiajun/article/details/86222735

求最大公约数

	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;
	}

猜你喜欢

转载自blog.csdn.net/c_yejiajun/article/details/86222735
今日推荐