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

C++, modulo, nieporządane działanie

Ostatnio zmodyfikowano 2016-01-26 18:38
Autor Wiadomość
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):
C/C++
#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 ) //po dodaniu tego warunku nie działa poprawnie, wypluwa puste linie
        { //
            m = m + 1; //
        } //
       
       
        for( int j = m; j <= n; j += 2 ) // bez warunku na parzystość/nieparzystość liczby m trzeba zrobić skok j+=1, bo musimy sprawdzać wszystko
        {
            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  
P-144039
« 1 »
  Strona 1 z 1