liczby pierwsze-pętla do-while
Ostatnio zmodyfikowano 2016-04-18 23:40
soldiervv Temat założony przez niniejszego użytkownika |
liczby pierwsze-pętla do-while » 2016-04-18 20:53:10 Mam następujący problem. Napisałem taki oto program (w celach nauki) mający sprawdzić czy wpisana liczba jest pierwsza:
#include<iostream> #include<conio.h> #include<math.h>
using namespace std;
int main() { int n; int k; cout<<"Podaj k"<<endl; cin>>k; int pierwsza (int k); if (pierwsza(k)) cout<<"liczba jest pierwsza"; else cout<<"nie jest pierwsza"; return 0; }
int pierwsza (int k) { int i=2; int p=1; do { if(k%i==0) { p=0; //break; } else p=1; ++i; } while((k%i)&&i<k); return p; }
Problem polega na tym, że działa on poprawnie tylko wtedy, gdy w klamrze po "if"-ie jest break. Moim zdaniem jest on niepotrzebny, jednak bez niego program dla dowolnej liczby stwierdza (błędnie) że jest pierwsza. Nie wiem dlaczego tak się dzieje. Z góry dziękuję jakby ktoś zechciałby mi to wytłumaczyć. |
|
Masterpc16 |
» 2016-04-18 22:13:02 Witam trochę bałaganu jest w tym kodzie po co w nawiasach po while jest ten warunek (k%i) on jest zbędny ,nie potrzebne również jest else ponieważ już masz przypisaną wartość zmiennej p gdyby jej nie było to musiałbyś to dać aczkolwiek to by myliło program jeśli nie chcesz dać break ponieważ pętla cały czas się wykonuje i cały czas się zmienia wartość p i tak na prawdę o ostatecznym wyniku zadecyduje działanie k%i gdzie i wynosi k-1, poniżej zamieszczam ten kod z lekkimi poprawkami warto użyć zmiennej typu bool do sprawdzania warunków kiedy masz prawda lub fałsz, teraz ten program działa bez problemu #include<iostream> #include<conio.h> #include<math.h>
using namespace std;
int main() { int n; int k; cout << "Podaj k" << endl; cin >> k; int pierwsza( int k ); if( pierwsza( k ) ) cout << "liczba nie jest pierwsza"; else cout << "liczba jest pierwsza"; return 0; }
int pierwsza( int k ) { int i = 2; bool p = true; do { if( k % i == 0 ) { p = false; } ++i; } while( i < k ); return p; }
można jeszcze w inny sposób wykonać to zadanie bez pętli do .. while #include <iostream> using namespace std; int main() { int cyfra( 0 ); bool pierwsza( true ); cout << "Podaj cyfre "; cin >> cyfra; for( int i = 2; i < cyfra; i++ ) { if( cyfra % i == 0 ) { pierwsza = false; break; } } if( pierwsza ) cout << "Liczba " << cyfra << " jest liczba pierwsza" << endl; else cout << "Liczba " << cyfra << " nie jest liczba pierwsza" << endl; }
|
|
soldiervv Temat założony przez niniejszego użytkownika |
» 2016-04-18 22:23:57 Dzięki. Zauważyłem teraz też, że w moim kodzie będzie wszystko działać poprawnie jak dam operator preinkrementacji zaraz po otwierającej klamrze po "do". Ale i tak twój kod jest dużo bardziej czytelny, tak więc dzięki jeszcze raz. |
|
Masterpc16 |
» 2016-04-18 22:30:50 do { i++; if( k % i == 0 ) { p = false; / } } while( i < k )
|
|
soldiervv Temat założony przez niniejszego użytkownika |
» 2016-04-18 23:40:25 Racja. |
|
« 1 » |