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

Liczby pierwsze i złożone

Ostatnio zmodyfikowano 2016-09-11 15:28
Autor Wiadomość
lukas0420
Temat założony przez niniejszego użytkownika
Liczby pierwsze i złożone
» 2016-09-09 22:17:38
Napisałem program, który ma sprawdzać czy wprowadzona przez użytkownika liczba jest pierwsza czy złożona. Chce koniecznie oprzeć to na pętli do{...}while oraz na if, próbowałem zrobić to tak, że program szuka dzielnika, jeżeli znajdzie to pokaże że liczba jest złożona, przeciwnie że jest pierwsza. Niestety po kompilacji programu, wpisując obojętnie jaką liczbę, cały czas pokazuje, że liczba jest złożona. Szczerze powiem, zaczynam dopiero przygodę z c++ i nie bardzo wiem jaki błąd popełniłem. Byłbym wdzięczny za pomoc :D

C/C++
#include <iostream>

using namespace std;

int main( int argc, char ** argv ) {
    cout << "Podaj liczbe: ";
    int a, b;
    cin >> a;
    b = 2;
    do {
        b++;
    } while( b != a );
   
    if( a % b != 0 ) {
        cout << "Liczba ta jest pierwsza"; }
    else {
        cout << "Liczba ta jest zlozona"; }
    return 0;
}
P-151607
Knayder
» 2016-09-09 22:25:31
Polecam ci poczytać trochę o tym :)
https://pl.wikipedia.org/wiki/Sito_Eratostenesa
P-151609
kistel66
» 2016-09-09 22:31:45
Najprostsza wersja chyba tak by wyglądała:
C/C++
#include <iostream>
using namespace std;

int main( int argc, char ** argv ) {
    cout << "Podaj liczbe: ";
    int a, b;
    cin >> a;
    b = 2;
    do {
        b++;
    } while( b != a );
   
    if( b % 2 == 0 ) {
        cout << "Liczba ta jest zlozona"; }
    else {
        cout << "Liczba ta jest pierwsza"; }
    return 0;
}
P-151610
mateczek
» 2016-09-09 22:37:08
@up sprawdź swój kod dla liczby 15
C/C++
#include <iostream>
#include <cmath>

using namespace std;

int main( int argc, char ** argv ) {
    cout << "Podaj liczbe: ";
    bool pierwsza = true;
    int a, b;
    cin >> a; //wczytujemy liczbę do testu
    b = 2;
    do {
        if( a % b == 0 ) { //jeśli liczba dzieli się bez reszty znaczy koniec obliczeń liczba nie jest pierwszą znalazłem całkowity dzielnik
            pierwsza = false;
            break;
        }
        b++;
    } while( b < sqrt( a ) ); //liczymy dopóki dzielnik będzie mniejszy od pierwiastka z liczby
    //mała optymalizacja bo skoro sprawdziłeś już 4*5 to nie ma sensu lecieć dalej i sprawdzać 5*4
   
    if( pierwsza ) {
        cout << "Liczba ta jest pierwsza"; }
    else {
        cout << "Liczba ta jest zlozona"; }
    return 0;
}
P-151611
lukas0420
Temat założony przez niniejszego użytkownika
» 2016-09-10 09:53:02
Dobry pomysł z wykorzystaniem zmiennej bool, program działa poprawnie. A gdyby teraz sobie utrudnić i spróbować pominąć tą zmienną? Jest możliwe stworzenie takiego programu?
P-151619
michal11
» 2016-09-10 11:10:34
Przenieś warunek z ifa do while i na koniec sprawdzaj czy b jest mniejsze od pierwiastka, jeżeli tak to znaczy, że liczba jest złożona, jeżeli b jest równe pierwiastkowi to znaczy, że liczba jest pierwsza.

Generalnie pisanie wihile w sposób:
C/C++
while( warunek1 )
{
    if( warunek2 )
    {
        //...
        break;
    }
}

Jest raczej złą praktyką i pewnie w 95% przypadków warunek2 powinien być w while. A już najgorzej jak jest tam
while( true )
.
P-151624
Garniturek
» 2016-09-10 11:13:48
Można to zrobić za pomocą każdej innej zmiennej typu int, char itd.
Można też pominąć wstawianie jakiejkolwiek zmiennej i jeśli zostanie spełniony warunek a % b == 0, tylko przerwać pętle, a w następnym if'ie (poza pętlą) wyświetlić napis w zależności od wartości zmiennej b
P-151626
mateczek
» 2016-09-11 01:44:14
C/C++
#include <iostream>
#include <cmath>

using namespace std;

int main() {
    cout << "Podaj liczbe: ";
    int resztaZdzielenia;
    int a, b = 2;
    cin >> a; //wczytujemy liczbę do testu
    do {
    } while( b < sqrt( a ) &&( resztaZdzielenia = a % b++ ) ); //break można wywalić np tak
   
    if( resztaZdzielenia ) {
        cout << "Liczba ta jest pierwsza"; }
    else {
        cout << "Liczba ta jest zlozona"; }
    return 0;
}
P-151659
« 1 » 2
  Strona 1 z 2 Następna strona