Hackerrank – Popis problému
Celý popis zadania sa nacháza – Hackerrank.
Riešenie
Je potrebné urobiť faktorizáciu čísla (hranice) na prvočísla, lebo niektoré čísla sú zároveň deliteľmi ostatných čísel. Takto sa zbavíme zbytočného násobenia a skúšania deliť všetky čísla, sú sú deliteľné od 1
po n
.
Všetky prvočísla od 2
po N
si vieme vypočítať napr. pomocou Eratostenovho sita.
Vypočítame, koľkokrát je dané prvočíslo v zadanom čísle. Dopracujeme sa k niečomu, ako nasledovná rovnica:
kde
je početnosť krát prvočísla
v zadanom čísle.
Takto vieme rozložiť každé prirodzené číslo.
až
získame z Eratostenovho sita, zostáva nám už len určiť exponenty
. Exponenty vypočítame rovnicou:
a urobíme pre každé prvočíslo.
Vytvoril som riešenie v týchto programovacích jazykoch:
Všetky riešenia sú dostupné aj na mojom GitHub profile.
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class SmallestMultiple { // prime factorization // http://www.mathblog.dk/project-euler-problem-5/ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int tests = Integer.parseInt(scanner.nextLine()); for (int i = 0; i < tests; i++) { int number = Integer.parseInt(scanner.nextLine()); List<integer> primes = eratosthenes(number); long result = 1; for (int prime : primes) { int exp = (int) (Math.log(number) / Math.log(prime)); result *= (long) Math.pow(prime, exp); } System.out.println(result); } scanner.close(); } private static List<integer> eratosthenes(int number) { boolean[] array = new boolean[number + 1]; for (int i = 0; i < array.length; i++) { array[i] = true; } for (int i = 2; i < array.length; i++) { if(array[i]) { int j = i; while (i * j < array.length) { array[i * j] = false; j++; } } } List<integer> primes = new ArrayList<integer>(); for (int i = 2; i < array.length; i++) { if(array[i]) { primes.add(i); } } return primes; } } </integer></integer></integer></integer> |