最大公因数
- 求两个数的最大公因数,这两个数可能很大(效率问题)
//求最大公因数:辗转相除法 (性能好)
public static long gcd(long x,long y) throws Exception {
if(x<=0 || y<=0){
throw new Exception("error");
}
long r = x % y;
if(r == 0){
return y;
}
return gcd(x,r);
}
最小公倍数
求两个数的最小公倍数
//求最小公倍数 性能优
public static long lcm(long x,long y) throws Exception {
long gcd = gcd(x,y); //利用上面求的最大公因数
return (x/gcd)*(y/gcd)*gcd;
}
一个数的所有因子
求一个数的所有因子,这个数可能很大
//求一个数的所有因子 要求:快速 能处理大数
public static Set<Long> allFactor(long bigNum){
Set<Long> set=new HashSet<Long>();
for (long i=1;i*i<= bigNum;++i){
if( bigNum%i==0){
set.add(i);
set.add( bigNum/i);
}
}
return set;
}
求阶乘
这个阶乘的结果可能很大
//求阶乘 求大数的阶乘
public static BigInteger fact(long bigNum){
BigInteger fac = BigInteger.ONE;
for (int i = 2; i <=bigNum ; i++) {
fac =fac.multiply(BigInteger.valueOf(i));
}
return fac;
}
是否素数
判断一个数是否是素数(质数),O(sqrt(n))
//是否是素数
public static boolean isPrime(int x){
boolean isPrime = true;
if(x ==1 || x%2 == 0 && x != 2 )
{
isPrime = false;
}
else
{
for( int i = 3; i< Math.sqrt(x); i += 2)
{
if( x%i == 0)
{
isPrime = false;
break;
}
}
}
return isPrime;
}