Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Duże liczby i biblioteka GMP - problem z kompilacją(?)

Ostatnio zmodyfikowano 2016-06-20 21:07
Autor Wiadomość
oxygenium79
Temat założony przez niniejszego użytkownika
» 2016-06-05 08:36:18
Czy na pewno?
Przecież gdy sprawdzam podzielność liczby, to muszę wiedzieć, czy wynik dzielenia jest liczbą całkowitą, czy nie. Jak to sprawdzić operując tylko liczbami całkowitymi?
P-148875
oxygenium79
Temat założony przez niniejszego użytkownika
» 2016-06-05 08:57:42
Ale rzeczywiście, może zacznijmy od początku, żeby to nie okazał się problem XY.
Napisałem taki programik, który działa i znajduje liczby pierwsze (tutaj zaczyna szukać od liczby 25 w górę i kończy na pierwszej napotkanej liczbie pierwszej):

C/C++
#include <cstdlib>
#include <iostream>
#include <math.h>
#include <gmp.h>

int main()
{
    std::cout.precision( 20 ); // dokladnosc wyswietlania liczb
    long double liczba = 25; // liczba startowa
   
    int sprawdzenie = 0;
    long double wynik = 0;
   
   
    while( sprawdzenie == 0 ) {
       
        std::cout << "Liczba: " << liczba;
        std::cout << std::endl;
        sprawdzenie = 1; // zakladamy, ze liczba jest pierwsza
        long double granica = sqrt( liczba );
        unsigned long long dzielnik = 2;
       
        while( sprawdzenie == 1 && dzielnik <= granica )
        {
            wynik = liczba / dzielnik;
            unsigned long long posrednik = wynik;
           
            if( wynik == posrednik ) { sprawdzenie = 0; }
            dzielnik = dzielnik + 1;
        }
       
        if( sprawdzenie == 1 ) {
           
            std::cout << std::endl << "\t" << liczba << " jest liczba pierwsza.";
            std::cout << std::endl;
            std::cout << std::endl;
            std::cout << "\t" << "rekord w C++: 18446744073709551557 w 128 sekund - wiecej sie nie da(!)";
        }
       
        liczba = liczba + 2;
    }
    return 0;
}

No i wszystko super, tylko że powyżej 18446744073709551557 się nie da bez użycia GMP. :-)
Udało mi się zainstalować GMP i najwyraźniej działa, tylko nie potrafię przekonwertować mojego programiku tak, żeby używał GMP i ogarniał dowolnie duże liczby.
P-148876
mateczek
» 2016-06-05 10:14:09
nie potrzebujesz double by szukać liczb pierwszych.
A skoro korzystasz z C++ i koniecznie Windowsa to skompiluj sobie bibliotekę gmp ze wsparciem dla c++.

 ./configure --enable-shared --disable-static --enable-cxx
http://cpp0x.pl/forum/temat/​?id=22592&p=3

C/C++
#include <iostream>
#include <cmath>
using namespace std;
bool czyPierwsza( int liczba ) {
    if( liczba == 1 ) return false;
   
    int max = sqrt( liczba ); // nie musi być double
    bool pierwsza = true;
    for( int i = 2; i <= max; i++ ) {
        if( liczba % i == 0 ) { // dzielenie modulo
            pierwsza = false;
            break; }
    }
    return pierwsza;
}
int main() {
    int liczba;
    cin >> liczba;
    bool pierwsza = czyPierwsza( liczba );
    if( pierwsza ) cout << "TAK" << endl; else cout << "NIE" << endl;
}
P-148877
oxygenium79
Temat założony przez niniejszego użytkownika
» 2016-06-05 10:34:12
Chyba nie bardzo to działa, bo jak wpisałem "18446744073709551557234" to mi powiedział, że to jest liczba pierwsza. :-D
P-148878
mateczek
» 2016-06-05 10:40:18
Bo wkleiłem Ci program na intach zrobiony na potrzeby spoja !!!!
http://pl.spoj.com/problems/PRIME_T/
2147483647 - maxymalny int !!! to tylko przykład, że nie są potrzebne double!!!
C/C++
#include <iostream>
#include <cmath>
using namespace std;
bool czyPierwsza( unsigned long long liczba ) {
    if( liczba == 1 ) return false;
   
    unsigned long long max = sqrt( liczba ); // nie musi być double
    bool pierwsza = true;
    for( unsigned long long i = 2; i <= max; i++ ) {
        if( liczba % i == 0 ) { // dzielenie modulo
            pierwsza = false;
            break; }
    }
    return pierwsza;
}
int main() {
    unsigned long long liczba;
    cin >> liczba;
    bool pierwsza = czyPierwsza( liczba );
    if( pierwsza ) cout << "TAK" << endl; else cout << "NIE" << endl;
}
//zwiększony zakres. Aktualnie siedzę na Windowsie poza chatą i nie bardzo mam jak przetestować na większych liczbach
P-148879
oxygenium79
Temat założony przez niniejszego użytkownika
» 2016-06-05 10:52:23
OK, ale mi chodzi o liczby o dowolnej wielkości. Skoro mój programik działa i robi to co chcę, to założyłem, że wystarczy go rozszerzyć o obsługę GMP i dużych liczb.
Lub Twój.
P-148880
mateczek
» 2016-06-05 10:55:35
Chodzi tylko o to, że niepotrzebnie się bujasz z arytmetyką zmiennoprzecinkową !!!
C/C++
5 % 3 = 2 // bo operator modulo zwraca resztę z dielenia
//a sprawdzenie wystarczy pierwiastek zaokrąglony do całości

sqrt( 35 ) = 5.9 = 5 // ostatnia cyfra, która cię interesuje to 5
arytmetyka zmiennoprzecinkowa upierdzieli ci zawsze mantysę do jakiegoś przybliżenia a ty nie możesz sobie na to pozwolić !!!
P-148881
oxygenium79
Temat założony przez niniejszego użytkownika
» 2016-06-05 11:04:52
OK, załapałem, wystarczą mi całkowite.
Spróbuję przerobić zatem.
P-148882
1 « 2 » 3 4 5 6
Poprzednia strona Strona 2 z 6 Następna strona