Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Sprawdź, czy liczba jest liczbą pierwszą


Rekomendowane odpowiedzi

Opublikowano

Witam, mam problem z programem, który ma sprawdzać czy liczba jest liczbą pierwszą. Otóż przy wpisaniu każdej liczby dzielącej się przez 3, odpowiada mi, że jest ona liczbą pierwszą. W budowie programu nie powinienem użyć podprogramu itp itd, wszystko ma być w funkcji głównej. Proszę o pomoc w znalezieniu błędu w moim kodzie.

 

#include <iostream>

 
using namespace std;
 
 int main()
 {
  
  
     int n;
     int p;
 
 
     cout<<"1.Program sprawdzający, czy liczba n jest liczba pierwsza"<<endl;
  
                     cout<<"Wpisz liczbe: "<<endl;
     
  
     n>1;
     cin>>n;
     
     p=2;
  
  
     
    if(n==p)
    {
           cout<<"N jest liczba pierwsza"<<endl;
           }else
                  
    
                       
 for(p=3;p>n;p++)
   {
    if(n%p==0)
              {
                       cout<<"Liczba "<<n<<"  jest liczba pierwsza"<<endl;
                       }else cout<<"Liczba "<<n<<" nie jest liczba pierwsza" << endl;
};
             
 
    system( "PAUSE" );
    return 0;   
 
 
    
     }
 

 

Kocham mpcforum.pl!!!

18706.png

Opublikowano

w for masz p=3 czyli sprawdza ci liczby podzielnne przez 3 a nie przez 2:P

Do
$wiek+=1
Until ŻycieGetMsg() = -3

zbieram +

Opublikowano
#include <iostream>

using namespace std;

int main()
{
    int number;

    cout<<"1.Program sprawdzający, czy liczba n jest liczba pierwsza"<< endl;

    cout<<"Wpisz liczbe: "<<endl;
    cin >> number;
    if(number == 2){cout << "Jest pierwsza"; return 0;}
    if(number % 2 == 0) {cout << "Nie jest pierwsza"; return 0;}
    for(int i = 3; i * i < number; ++i)
    {
        if(number % i == 0)
        {
            cout << "Nie jest pierwsza"<<endl;
            return 0;
        }
    }
    cout << number << " jest pierwsza" << endl;

    return 0;

}

powinien się nie skapnąć w szkole ;c

 

@@edit

w sumie można nawet dodawać +2 i wtedy byłoby szybsze, bo nie musze sprawdzac parzystych (gdyby się dzieliło przez 4, 6, 8, etc. to dzieliło by się też przez 2)

Opublikowano

"który ma sprawdzać czy liczba jest liczbą pierwszą" czy liczba nie moze byc ujemna ?

if(liczba<2) cout << "nie";

if(liczba==2)cout << "tak"

i potem twoja petla

Opublikowano
?? ujemne liczby nie są liczbami pierwszymi

 

Z założenia liczby pierwsze to liczby naturalne.

Sprawdzanie założeń w programie to inna sprawa, nie wiem czy muszą.

Ale fakt, dobrze jest to wziąć pod uwagę.

Opublikowano

Prosze:

bool JestLiczbaPierwsza(int Liczba)
{
    bool RetValue = false;
    for(int i = 2; i < Liczba; ++i)
    {
        if(Liczba % i == 0) { RetValue |= true; }
    }
    return !RetValue;
}
Opublikowano

@MalakianPL
Da sie bardziej skomplikowac, no ale po co xdddd

 

 

 


Czego nie rozumiesz w funkcji?

-Funkcja zwraca czy liczba jest pierwsza czy nie(podajesz w parametrze liczbe)
-Na start ustwaiłem zmienną RetValue na false(RetValue oznacza czy jest podzielna przez cos)
-Petla for dla liczb od 2-(n-1), czyli sprawdzamy reszte z dzielenia dla liczb od 2 do zdekrementowanej liczby podanej w parametrze.
-Jezeli jest podzielna to bramka OR dla zmiennej return czyli wystarczy jedna sytuacja ze liczba jest podzielna przez cos i wtedy RetValue zostanie ustawiony na true.

-Na koniec negacja dla wyniku.(RetValue oznaczało czy jest podzielna przez cos, jak jest podzielna to true, A wiadomo ze liczby pierwsze są podzielne przez samą siebie i przez 1. Dlatego ta negacja).

Nie kompiluje sie bo zapomnialem srednika nie ma przy RetValue |= true;

Opublikowano
bool czyPierwsza(int liczba)
{
    if(liczba % 2 == 0) return false;
    for(int i = 3; i*i < liczba; i+=2)
        if(liczba % i == 0) return false;
    return true;
}

Nie prościej? Nie lepiej?

 

(można liczyć pierwiastek z liczba zamiast i*i raz poza pętlą. powinno być wydajniej)

 

Czego nie rozumiesz w funkcji?

 

Nie rozumiesz czemu robisz wszystko w najmniej wydajny i najmniej czytelny sposób

Opublikowano
bool czyPierwsza(int liczba)
{
    if(liczba % 2 == 0) return false;
    for(int i = 3; i*i < liczba; i+=2)
        if(liczba % i == 0) return false;
    return true;
}

Nie prościej? Nie lepiej?

 

(można liczyć pierwiastek z liczba zamiast i*i raz poza pętlą. powinno być wydajniej)

 

Nie rozumiesz czemu robisz wszystko w najmniej wydajny i najmniej czytelny sposób

 

Według wszystkich znaków na niebie 1 nie jest liczbą pierwszą, a twoja funkcja zwraca 1 jako liczbę pierwszą.

TuByłaSygnatura.png

Opublikowano
Według wszystkich znaków na niebie 1 nie jest liczbą pierwszą, a twoja funkcja zwraca 1 jako liczbę pierwszą.

 

Jego też. Przepisałem po prostu jak leci nie myśląc.

Opublikowano

To powinno wystarczyć

bool LiczbaPierwsza(int liczba)
{
    if(liczba<2)
        return false;

    for(int i=2; i*i<=liczba; i++)
        if(liczba%i==0)
            return false;

    return true;
}

TuByłaSygnatura.png

Opublikowano

Sopel tam pisał, że można liczyć pierwiastek i będzie wydajniejsze i to jest rzecz, na której wynik warto spojrzeć. Akurat jak kiedyś zmieniałem z i * i na sqrt(n) na spoju to z 1.97 na 0.26 zeszedł czas :)

 

Ps. równie dobrze można sito erastotenesa wygenerować i potem sprawdzić czy dana liczba się zawiera ;)

Opublikowano
,,W budowie programu nie powinienem użyć podprogramu itp itd, wszystko ma być w funkcji głównej."

Po co piszecie mu funkcje?

jeśli już to zróbcie mu to w funkcji main

cin>>a;

if(a<2)cout<<"NIE"

else if(a==2)cout<<"TAK"

else 

{

petla ze sprawdzaniem i tyle 

}

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...