C++, modulo, nieporządane działanie
Ostatnio zmodyfikowano 2016-01-26 18:38
Darnok Temat założony przez niniejszego użytkownika |
C++, modulo, nieporządane działanie » 2016-01-26 18:38:05 Problem pochodzi ze spoj-a (zadanie nr 2) Działanie w skrócie: 1. Podaj liczbę t<10 2. Podaj t przedziałów m...n 3. Dla każdego z przedziałów wypisz liczby pierwsze Program działał, ale pomyślałem, że z pętli for() bardzo małym nakładem pracy mogę wywalić liczby parzyste, bo na pewno nie są pierwsze i tym samym skrócę działanie programu o połowę. Pomysł prosty: sprawdzić parzystość liczby m; jeżeli parzysta to zwiększyć o 1, umieścić w pętli for i sprawdzać co 2 liczbę. Niestety spowodowało to, że program nie wypluwa nic na wyjściu, tylko kilka pustych linii. Nie jestem w stanie dojść dlaczego i proszę o pomoc. Oczywiście zdaję sobie sprawę, że do rozwiązania problemu liczb pierwszych istnieją pewnie inne, lepsze i wydajniejsze algorytmy, ale nie o to mi chodzi. Sprawdziłem jak zachowuje się liczba m w moim if-ie - zachowuje się w sposób zamierzony. Dlaczego warunek z modulo działa pozornie dobrze, ale zemiania działanie programu Kod (komentarze w felernym miejscu): #include<iostream> #include<math.h> using namespace std;
bool is_prime( int a ) { if( a % 2 == 0 || a != 2 ) { return false; } else if( a == 2 ) { return true; } else { float b = sqrt( a ); float c; for( int i = 3; i < b; i++ ) { c =( float ) a / i; if( c ==( int ) c ) { return false; } } return true; } }
int main( void ) { int t; std::cin >> t; if( t > 10 ) { return 0; } for( int k = 1; k <= t; k++ ) { int m, n; std::cin >> m >> n; if(( m % 2 ) == 0 ) { m = m + 1; } for( int j = m; j <= n; j += 2 ) { bool status = is_prime( j ); if( status ) { std::cout << j << "\n"; } } std::cout << "\n"; } return 0; }
EDIT: Głupi błąd w funkcji is_prime, użyłem złego operatora 'lub' zamiast 'i' przez co warunek był zawsze fałszem. W połączeniu z nieparzystością wyrazów w pętli for (gdy j+=2), program zgodnie z poleceniem nic nie wypisywał :P Czas potrzebny na rozwiązanie: 2 dni i to nie sam:P |
|
« 1 » |