常见小算法集合

在中型及大型公司面试过程中,通常都会涉及到一些算法的内容,掌握一些常见的基本算法,对于软件开发来说,其实是十分重要的,也是一种基本功。

1.判断质数

质数是除了被1和本身整除之外,再不能被其他整数整除的正整数。给定一个正整数,判断该整数是否是质数。下面给出实现代码:

/*
* 判定是否是质数
*/
public static boolean IsPrimeNumber(int n){
	if(n ==2 || n==3) return true;
	if(n%2 == 0) return false;
	int i;
	for(i=3; i<n/2; i+=2){
		if(n%i==0) return false;
	}
	return true;
}
2.求最大公约数和最小公倍数

最大公约数是几个数能被整除的最大数,最小公倍数是共同的最小倍数。

下面给出最大公约数的求法:

public class Math {
	public static int getMaxDivide_ab(int a,int b){
		if(a==0 || b== 0) {
			System.out.print("arguments can not be 0");
			return -1;
		}
        int value=1;
        int max;
        int min;
        if(a==b){
                return a;
        }
        if(a>b){
                max=a;
                min=b;
        }else{
                max=b;
                min=a;
        }
        if(max%min==0) return min;
        for(int i=2;i<min;i++){
                if(0==max%i && 0==min%i){
                        value=i;
                }
        }
        return value;
	}
}
这是使用循环的方式求取最大公约数,事实上还有一个非常有名的定理来求取最大公约数,即欧几里德定理:

若a和b的最大公约数为f(a,b),则f(a,b)=f(b,a%b)

有了这个定理,我们就可以采用地鬼的方式求取最大公约数

public class Math {
	public static int oujilide(int a,int b){
        if(a<b){
                int temp;
                temp=a;
                a=b;
                b=temp;
        }
        if(0==b){
                return a;
        }
        return oujilide(b,a%b);
	}
}
有了最大公约数,最小公倍数就是a*b/f(a,b),所以最小公倍数的求法如下:

int lcm(int a, int b) //最小公倍数
{
	return a * b / oujilide(a,b);
}
3.分解质因数

分解质因数是将给定的数字分解成被整除的数相乘的形式,如145 = 5 * 29

public class Math {
	public static void primeFactor(int n){
		if(n<2) {
			System.out.println("n must >= 2");
			return;
		}
		int primeNumber = 2;// 定义最小的质数  
        System.out.print(n + " = ");  
		while (primeNumber <= n){
			if (primeNumber == n) {// 当质数等于输入的数时,直接输出  
                System.out.print(n);  
                break;// 跳出循环  

            } else if (n % primeNumber == 0) {// 当输入的数与质数的余数为0时,输出这个质数  

                System.out.print(primeNumber + " * ");  
                n = n / primeNumber;// 把剩下的结果赋给num  
            } else {// 在余数不为0时,质数递增  
                primeNumber++;  
            }  
		}
	}
}
4.测试

public class Hello {
	public static void main(String[] args){

		int n = 34555;
		if(AlgorithmHelper.IsPrimeNumber(n))
			System.out.println(n + " is prime number.");
		else
			System.out.println(n + " is not prime number.");
		
		int a = 100;
		int b = 50;
		//int result = AlgorithmHelper.getMaxDivide_ab(a, b);
		int result = AlgorithmHelper.oujilide(a, b);
		System.out.println("max divide number of " + a + " and " + b + " is " + result);
		System.out.println("min double number of " + a + " and " + b + " is " + a*b/result);
		
		AlgorithmHelper.primeFactor(145);
	}
}
输出如下:

34555 is not prime number.
max divide number of 100 and 50 is 50
min double number of 100 and 50 is 100
145 = 5 * 29
5.总结

数据结构和算法是一个真正的程序员必须掌握的基础,面试的时候还是很考验一个人的逻辑思维能力的,每个人都需要掌握一些。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值