• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Znajdowanie najmniejszej liczby z 2^500500 dzielnikami

VPS Starter Arubacloud
0 głosów
430 wizyt
pytanie zadane 26 grudnia 2017 w C i C++ przez Przemko Nowicjusz (140 p.)
edycja 26 grudnia 2017 przez Arkadiusz Waluk

Natrafilłem na ciekawe zadanie programistyczne, ale niestety program liczy już ponad 20 minut i nie może się doliczyć. Byłbym wdzięczny gdybyście mi pomogli przy optymalizacji kodu (i w ogóle sprawdzili czy jest dobrze :D).

Treść zadania:

Liczba dzielników 120 wynosi 16. W rzeczywistości 120 jest najmniejszą liczbą mającą 16 dzielników. Znajdź najmniejszą liczbę z  2^500500 dzielnikami. Podaj odpowiedź jako modulo 500500507.

Mój kod:

#include <iostream>
#include <cmath>
using namespace std;
int main() {
    int dzielniki = 0, liczba = 500000, dzielnik = 1;
    while (dzielniki <= pow(2, 500500)) {
        dzielniki = 0;
        for (; dzielnik <= liczba; dzielnik++) {
            if (liczba % dzielnik == 0)
                dzielniki++;
        }
        if (dzielniki == pow(2, 500500))
            cout <<"Wynik to: " <<  liczba % 500500507 << endl;
        liczba++;
    }
    system("pause");
    return 0;
}

2 odpowiedzi

+1 głos
odpowiedź 26 grudnia 2017 przez CzikaCarry Szeryf (75,340 p.)
Po pierwsze primo, liczba 2^500500 nie zmieści się w żadnym dostępnym w bibliotece standardowej typie całkowitym (największą liczba jaka się zmieści to (2^64)-1), po drugie, po napisaniu odpowiedniego typu, policzenie wartość tej liczby na statystycznym komputerze raczej nie skończyłoby się przed samozapadnięciem się słońca.

Jest to zadanie na myślenie. Powypisuj sobie na kartce dzielniki kolejnych potęg liczby 2 (np. aż wartość potęgi wyniesie 64), a coś zauważysz :)

Pozdrawiam.
komentarz 26 grudnia 2017 przez Schizohatter Nałogowiec (39,600 p.)
Taka notka: ułamek sekundy zajęło policzenie tej liczby w Ruby. Być może zastosowana jest jakaś sztuczka pod maską. Choć dla 13^500500 też poszło błyskawicznie.
komentarz 26 grudnia 2017 przez SebekChlebek Stary wyjadacz (11,290 p.)
Tak samo Python :D Liczba cyfr: 150666, ogromna liczba.
+1 głos
odpowiedź 26 grudnia 2017 przez Schizohatter Nałogowiec (39,600 p.)

To jest zadanie czysto matematyczne, nie programistyczne.

Niemniej podstawową optymalizacją byłoby obliczenie `pow(2, 500500)` tylko raz i zapisanie tego w zmiennej. Zakładając, że w ogóle ta funkcja daje jakikolwiek wynik w C++, bo jest to gargantuiczna liczba. W Ruby liczy tę liczbę błyskawicznie na moim starym procku, więc możliwe, że C++ też obsłuży tę liczbę bez żadnych sztuczek. A może potrzebna jest specjalna biblioteka?

komentarz 26 grudnia 2017 przez niezalogowany
boost.multiprecision da radę, ale pewnie i tak chodzi o algorytm ;)

Podobne pytania

0 głosów
1 odpowiedź 7,341 wizyt
0 głosów
1 odpowiedź 1,620 wizyt
pytanie zadane 28 lutego 2016 w C i C++ przez Madrox24 Początkujący (350 p.)
0 głosów
1 odpowiedź 2,637 wizyt

93,005 zapytań

141,970 odpowiedzi

321,249 komentarzy

62,341 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...