mati1995g Temat założony przez niniejszego użytkownika |
[C++] Liczby pierwsze » 2014-04-10 21:10:48 Witam! W szkole dostałem zadanie napisania programu do sprawdzenia czy liczba jest liczbą pierwszą, ale mój nauczyciel powiedział, że muszę poprawić program bo jest źle napisany i mam mu przynieść do oceny jak poprawie. Więc od razu mówię,że jestem kompletnym amatorem, program napisałem w 5min i myślałem, że tak powinno być, więc proszę o ewentualnie wskazówki co powinienem poprawić ( nauczyciel mówi co jest źle dopiero po ocenie :p). Z góry dziękuje za pomoc. #include <iostream>
#include <cstdlib>
using namespace std; int main( int argc, char * argv[] ) { int x = 0; float wynik = 0; int z = 0; cout << "Podaj liczbe: "; cin >> x; for( int i = 1; i < x + 1; i++ ) { wynik = x % i; if( wynik == 0 ) z = z + 1; } cout << endl; cout << "Liczba dzielnikow: " << z << endl << endl; if( z == 2 ) cout << "To jest liczba pierwsza !!!" << endl << endl; system( "pause" ); return 0; }
|
|
michal11 |
» 2014-04-10 23:29:25 1. Spróbuj lepiej formatować kod, przede wszystkim dawać więcej enterów wtedy wygodniej się to czyta. 2. Spróbuj inaczej nazywać zmienne, bo jak widzę z = z + 1 (co nawiasem mówiąc powinno wyglądać tak: ++z ) to muszę się domyślać i sprawdzać co to oznacza. 3. Nie używaj float tylko double, no chyba, że musisz. 4. W ogóle zmienna wynik nie jest potrzebna wystarczy if( x % i == 0 ) . 5. W pętli i < x + 1 zamienił bym na i <= x Ciężko coś tutaj namieszać bo to jest dość prosty algorytm, i wydaje mi się, że twój nauczyciel miał właśnie zastrzeżenia dotyczące formy i ogólnych praktyk(czyli to co wypunktowałem). |
|
bombatom69 |
» 2014-04-11 03:54:21 Pomijając dziwny kod, masz błędy merytoryczne.
1. Nie słuchaj mojego poprzednika w kwestii typu, bo liczby pierwsze są wszystkie jak jedna naturalne a więc całkowite dodatnie. Zrezygnuj z float.
2. Liczba "1" jest tzw. niezmiennikiem mnożenia. Nie jest liczbą pierwszą i jako taka powinna być odrzucana wcześniej. Ogolnie przydałaby się instrukcja w stylu
if(x<2) ... liczba nie jest pierwsza
3.
for( int i = 2; i < x; i++ ) {
Bo nie możesz wymieniać wsrod dzielnikow jedynki i liczby badanej. Kazda liczba dzieli się przez 1 i sama siebie. |
|
michal11 |
» 2014-04-11 18:11:42 Hmm szczerze mówiąc to nie wiem o co chodzi z tym "Nie słuchaj mojego poprzednika w kwestii typu". bombatom69 jak byś mógł wyjaśnić. |
|
bombatom69 |
» 2014-04-12 23:15:11 Hmm szczerze mówiąc to nie wiem o co chodzi z tym "Nie słuchaj mojego poprzednika w kwestii typu". bombatom69 jak byś mógł wyjaśnić. |
Nie ma tam w programie wskazania do używania liczb ułamkowych. Zbiór liczb pierwszych jest podzbiorem naturalnych. Reszta z dzielenia również jest całkowitą wartością. Więc i z punktu widzenia zarówno matematyki jak i C/C++, typ zmiennoprzecinkowy nie powinien się tam znaleźć żaden.
|
|
michal11 |
» 2014-04-13 19:51:16 No tak mi tylko chodziło o to, żeby programując nie używał float tylko double, ponieważ double jest bardziej dokładne. |
|
bombatom69 |
» 2014-04-14 22:41:27 Wybacz, ale to co piszesz jest jakąś nowoczesną paplaniną.
1. Gdyby float było z natury złe(jak można wywnioskować z Twojej wypowiedzi), byłoby z całą pewnością już dawno wycięte.
2. Zapoznaj się z opisem formatu, wówczas może dowiesz się jakie warunki musiałbyś spełnić aby float stało się niedokładne. Sprawdź na swojej maszynie rozmiar float i zobacz parametry tego formatu dla takiego rozmiaru.
3. Nakłanianie ludzi aby korzystali z double zamiast float, jest zupełnie dla mnie niezrozumiałe. Przyjdzie Ci kiedyś fantazja namówić siebie na rezygnację z double na rzecz long double, pomimo skromnych potrzeb. Może się zdarzy, że będziesz potrzebował zaalokować sporą tablicę. Wówczas zaczniesz zachodzić w głowę, dlaczego właściwie stało się tak, że program wyssał Ci tyle pamięci.
Tutaj pytający nie potrzebuje w ogóle ułamków a Ty zachęcasz go do zwiększenia zakresu. Gdzie w tym sens?
|
|
michal11 |
» 2014-04-15 17:28:09 Może inaczej, ja mam złe doświadczenia z float, dlatego dla liczb zmiennoprzecinkowych stosuję double. |
|
« 1 » |