Project Euler - 5

欧拉项目 题目4

problem :  

2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.

What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?

translation:  能整除 1 到 10 所有整数的最小正整数是 2520, 求能整除 1 到 20所有数的 最小正整数。


解法一: 暴力解法

这个函数传入一个int型的集合,这里假设最后一个数是最大的 n = 20, 所以每次加的值为20,不要犯傻一直加一。 用i来mod数组中的每一个数,只要有一个不能整除那么就增加i,如果所有都能整除,则得到了我们要得结果。

public static long getResult(ArrayList<Integer> arr){
        int n = arr.get(arr.size()-1);
        for(long i=n; ; i+=n){
            for(int j=1; j<arr.size(); j++){
                if( i % arr.get(j) != 0 ){
                    break;
                }
                if(j == arr.size()-1){
                    return i;
                }
            }
        }
    }

解法二:其实要求所有数的最小公数,是一个庞大的工程。那么假设,如果这里20个数只有两个,那么我们就是求两个数的最小公倍数,如果再增加一个数,就是求前两个数的最小公倍数和第三个数的最小公倍数,这样依次类推,其实最后我们都是在求两个数的最小公倍数。


//求两个数的最小公倍数
public static long getMinMutiple(long num1, long num2){
	return num1*num2/getCommonFactor(num1, num2);
}
	
//求两个数的最大公约数
public static long getCommonFactor(long num1, long num2){
	if( num1 > num2 ){
		num1 = num1 + num2;
		num2 = num1 - num2;
		num1 = num1 - num2;
	}
		
	for(long i=num1; i>1; i--){
		if(num2%i == 0 && num1%i == 0){
			return i;
		}
	}
	return 1;
}

//主函数
public static void main(String[] args) {
        long[] arr = new long[20];
        for(int i=1; i<=20; i++){
            arr[i-1] = i;
        }
        for(int i=2; i<20; i++){
            arr[i-1] = getMinMutiple(arr[i-2], arr[i-1]);
        }
        for(int i=0; i<20; i++){
            System.out.println(""+arr[i]);
        }
        
    }

这样做可以减少很大的开支


你可能感兴趣的:(算法,欧拉项目)