最大公约数
int gcd(int a,int b){
if(b==0) return a;
else return gcd(b,a % b);
}
最小公倍数
//先求出最大公约数d
int lcm(int a,int b){
int d=gcd(a,b);
return a/d*b;
}
素数
一般筛法
判断素数算法:除了1和自身,不能被其他数整除
boolean isprime(int n){
if(n <= 1) return false;
int sqr = (int)sqrt(1.0 * n);
for(int i = 2;i<= sqr;i++){
if(n % i==0) return false;
}
return true;
}
埃氏筛法
- 2是素数,那么2的倍数4、6、8、10等一定不是素数,筛除。
- 3没有被筛除,3是素数,3的倍数一定不是素数,筛除。
- 4已经被筛除。
- 5没有被筛除,5是素数,筛除所有5的倍数。
- 以此类推。
可以发现,需要一个boolean数组记录某数是否已经被筛除。
//boolean数组一开始默认false,表示都默认是素数
boolean[] p=new boolean[n];
int[] prime=new int[n];
int t=0;
for(int i=2;i<n;i++){
if(p[i]==false){
prime[t++]=i;//存储素数
//如果是素数,则把后续的倍数全都记为true
for(int j=i+i;j<n;j+=i){
//把i的倍数全都筛掉
p[j]=true;
}
}
}
数学算法精粹
2811

被折叠的 条评论
为什么被折叠?



