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? |
|
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): #include <cstdlib> #include <iostream> #include <math.h> #include <gmp.h>
int main() { std::cout.precision( 20 ); long double liczba = 25; int sprawdzenie = 0; long double wynik = 0; while( sprawdzenie == 0 ) { std::cout << "Liczba: " << liczba; std::cout << std::endl; sprawdzenie = 1; 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. |
|
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#include <iostream> #include <cmath> using namespace std; bool czyPierwsza( int liczba ) { if( liczba == 1 ) return false; int max = sqrt( liczba ); bool pierwsza = true; for( int i = 2; i <= max; i++ ) { if( liczba % i == 0 ) { pierwsza = false; break; } } return pierwsza; } int main() { int liczba; cin >> liczba; bool pierwsza = czyPierwsza( liczba ); if( pierwsza ) cout << "TAK" << endl; else cout << "NIE" << endl; }
|
|
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 |
|
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!!! #include <iostream> #include <cmath> using namespace std; bool czyPierwsza( unsigned long long liczba ) { if( liczba == 1 ) return false; unsigned long long max = sqrt( liczba ); bool pierwsza = true; for( unsigned long long i = 2; i <= max; i++ ) { if( liczba % i == 0 ) { 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; }
|
|
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. |
|
mateczek |
» 2016-06-05 10:55:35 Chodzi tylko o to, że niepotrzebnie się bujasz z arytmetyką zmiennoprzecinkową !!! 5 % 3 = 2
sqrt( 35 ) = 5.9 = 5
arytmetyka zmiennoprzecinkowa upierdzieli ci zawsze mantysę do jakiegoś przybliżenia a ty nie możesz sobie na to pozwolić !!! |
|
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. |
|
1 « 2 » 3 4 5 6 |