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?
Solution
Attempt 1: Count the occurrences of the prime factor for each number, and multiply them all.
private static Map<Integer, Integer> primeNumberOccurrence = new HashMap<>();
public static void main(String[] args) {
for (int i=2; i<=20; i++){
updatePrimeNumberOccurrence(i);
}
int total = 1;
for (int key : primeNumberOccurrence.keySet()){
int occurrence = primeNumberOccurrence.get(key);
total *= Math.pow(key, occurrence);
}
System.out.println(total);
}
private static void updatePrimeNumberOccurrence(int number){
int divisor = 2;
int divisorCount = 0;
while(number > 1){
if(number % divisor == 0){
number = number / divisor;
divisorCount++;
}else{
update(divisor, divisorCount);
divisor++;
divisorCount = 0;
}
}
update(divisor, divisorCount);
}
private static void update(int divisor, int divisorCount){
if (divisorCount != 0){
int oldCount = primeNumberOccurrence.get(divisor) != null ? primeNumberOccurrence.get(divisor) : 0;
if (divisorCount > oldCount){
primeNumberOccurrence.put(divisor, divisorCount);
}
}
}
Attempt 2: Use greatest common factor
private static final int NUMBER = 20;
public static void main(String[] args) {
int total = NUMBER;
for (int i = NUMBER-1; i >= 2; i--){
//greatest common factor
total *= i / BigInteger.valueOf(total).gcd(BigInteger.valueOf(i)).intValue();
}
System.out.println(total);
}
No comments:
Post a Comment