import java.util.*; public class du6cv2 { static {Locale.setDefault(Locale.US);} /* * Pokročilí: Dokonalé číslo je takové číslo, které je rovno součtu všech svých dělitelů. * Číslo 6 je dokonalé, protože 6 = 1 + 2 + 3. Napište funkci, která zjistí, zda dané číslo je dokonalé. * Pomocí této funkce zjistěte počet dokonalých čísel menších než 1 000 000 a tato čísla vypište. */ public static boolean dokonalost(long vstup) { /* * Dokonalost jednoho cisla, tato funkce je velice pomala a nevhodna pro velke rozsahy */ long t = 0; long hranice = vstup/2; //vyrazne zrychleni, nemusi se pocitat pri kazdem pruchodu cyklem for (long i = 1;i <= hranice;i++) if (vstup % i == 0) //je delitelem { t += i; i += vstup % i; } if (t == vstup) return true; else return false; } public static boolean isPrime(long vstup) { /* * Pomocna fce pro kontrolu prvociselnosti */ if (vstup == 1) return false; double p = Math.sqrt(vstup); for (long i = 2;i <= p; i++) if (vstup % i == 0) return false; return true; } public static void dokonalost_prime(long hranice) { /* * Hledani dokonalych cisel pomoci Euklidovy vety : * If as many numbers as we please beginning from a unit be set out continuously in double proportion, * until the sum of all becomes a prime, and if the sum multiplied into the last make some number, the product will be perfect. */ long soucet = 0; long posledni_clen = 0; long pocet_clenu = 0; for (long i = 1 ; i < hranice ; i *= 2) { posledni_clen = i; soucet += i; if (isPrime(soucet)) { if (soucet*posledni_clen > hranice) break; System.out.println(soucet*posledni_clen); pocet_clenu++; } } System.out.println("V intervalu <1,"+hranice+"> je prave "+pocet_clenu+" dokonalych cisel"); } public static void main(String[] args ) { Scanner scan=new Scanner(System.in); System.out.println(">>> START "+Locale.getDefault()+" # 1 \n"); System.out.println("Zvolte si zpusob hledni dokonalych cisel : "); System.out.println("1 : klasicky"); System.out.println("2 : pomoci Euklidovy vety"); int volba = scan.nextInt(); long hranice; switch (volba) { case 1 : { long pocet_clenu = 0; System.out.println("Pozor ! Tento zpusob je velmi pomaly a neni doporucen pro intervaly vetsi nez 10000"); System.out.println("Zadejte horni hranici intervalu pro hledani dokonalych cisel"); hranice = scan.nextLong(); System.out.println(""); for (long i = 1;i <= hranice;i++) if (dokonalost(i)) { System.out.println(i); pocet_clenu++; } System.out.println("V intervalu <1,"+hranice+"> je prave "+pocet_clenu+" dokonalych cisel"); break; } case 2 : { System.out.println("Tato metoda pouziva Euklidovu vetu o dokonalych cislech a je vyrazne rychlejsi"); System.out.println("Zadejte horni hranici intervalu pro hledani dokonalych cisel"); hranice = scan.nextLong(); System.out.println(""); dokonalost_prime(hranice); break; } } System.out.println(">>> STOP"); } }