celi1962 Temat założony przez niniejszego użytkownika |
Błąd w zadaniu. » 2009-02-05 22:42:22 Mam napisać program znajdujący dla danej liczby "n" (gdzie 1<n<10) pierwszą n-dziesiątkę liczb naturalnych wśród których nie ma liczby pierwszej (jeśli podam wybiorę liczbę 5 to mam otrzymać 50 kolejnych liczb złożonych dla n>5, czyli 6,8,9,i.t.d jeśli podam 2 to mam otrzymać 20 kolejnych liczb złożonych dla n>2, czyli 4,6,8,9 i.t.d. Proszę o pomoc nie potrafię sobie z tym poradzić wcześniej zrozumiałam zadanie trochę inaczej, a mianowicie (jeśli n=5 to ma znaleźć wśród pięćdziesięciu kolejnych liczb naturalnych takie liczby, które nie są liczbami pierwszymi). Zadanie zrobiłam tak z pomocą kolegi na forum próbowałam tu trochę zmieniać i nawet pokazuje liczby większe od zadanego n ale nie pokazuje ich n-tkę.Proszę o pomoc mam ostatni termin zaliczenia. #include <iostream> #include <cstdio> #include <cmath>
using namespace std;
int main() { int i, j, zakres, n, b; cout << "Podaj gorny zakres: "; cin >> n; zakres = n * 10; bool * tablica = new bool[ zakres + 1 ]; b = sqrt(( float ) zakres ); for( i = 2; i < zakres + 1; i++ ) tablica[ i ] = true; for( i = 2; i <= b; i++ ) if( tablica[ i ] == true ) for( j = i + i; j < zakres + 1; j = j + i ) tablica[ j ] = false; cout << "Liczby, ktore nie sa pierwsze: " << endl; for( i = 1; i < zakres + 1; i++ ) if( tablica[ i ] == false ) cout << i << " "; cin.ignore(); getchar(); return 0; }
|
|
DejaVu |
» 2009-02-06 05:02:49 int ilosc = 0; cout << "Liczby, ktore nie sa pierwsze: " << endl; for( i = 1; i < zakres + 1; i++ ) { if( tablica[ i ] == false ) { cout << i << " "; ilosc++; } if( ilosc >= zakres ) break; } /edit: bool * tablica = new bool[ zakres + 1 ]; Wydaje mi się, że to będzie za mała tablica i za mało liczb. Przykładowo jeśli: n = 2, to masz wypisać 20 liczb kolejnych (niepierwszych), większych od 2. Tymczasem Ty uzyskasz zakres 2..21, co daje 19 liczb i w tym jeszcze są liczby pierwsze, więc uzyskasz za mało liczb. Moim zdaniem tablica powinna mieć rozmiar: bool * tablica = new bool[ zakres * 2 + n ]; Powód jest prosty. Na 100% co druga liczba jest parzysta, a co za tym idzie nie jest liczbą pierszą a co za tym idzie to w zbiorze o rozmiarze zakres*2+n istnieje conajmniej (zakres*2+n)/2 liczb nie pierwszych, czyli zakres+n/2, czyli zawsze jest więcej niż potrzebujesz wypisać. |
|
DeBugger |
» 2009-02-06 08:00:44 Hmm. Moze to głupi pomysł, ale możnaby użyć vectora do rozszerzania tablicy? Wtedy by było bez problemu i możnaby znajdować te liczby do nieskończoności. |
|
celi1962 Temat założony przez niniejszego użytkownika |
» 2009-02-06 23:17:20 Dzięki "manfred" za pomoc. Program śmiga ale wiele oznaczeń jest dla mnie niezrozumiałych.Mielismy może w tym semestrze ze 4 konkretne zajęcia na temat C++. prowadzący prosi o dokładne wyjaśnienie krok po kroku co wszystko oznacza. Jeśli mógłbyś rzucić okiem na moje poprawki zasugerowane przez pana PIOTRA. Niestety nie podaje właściwych liczb. Proszę o pomoc!!!! Podaję kod po poprawkach #include<iostream> #include<cstdio> #include<cmath> using namespace std; int main() { int i, j, zakres, n, b; cout << "Podaj liczbe naturalna:" << endl; cin >> n; zakres = n * 10; bool * tablica = new bool[ zakres * 2 + n ]; b = sqrt(( float ) zakres ); for( i = 2; i < zakres * 2 + n; i++ ) tablica[ i ] = true; for( i = 2; i <= b; i++ ) if( tablica[ i ] == true ) for( j = i + i; j < zakres * 2 + n; j = j + i ) tablica[ j ] = false; int ilosc = 0; cout << "Liczby, ktore nie sa pierwsze:" << endl; for( i = 1; i < zakres * 2 + n; i++ ) { if( tablica[ i ] == false ) { cout << i << " "; ilosc++; } if( ilosc >= zakres ) break; } cin.ignore(); cout << "\n"; cout << "\n"; cout << "Wcisnij Enter zeby zakonczyc!!!!!!!"; getchar(); return 0; }
|
|
DejaVu |
» 2009-02-07 04:37:25 |
|
manfred |
gotowiec » 2009-02-06 14:37:58 #include <iostream> #include <cmath>
using namespace std;
int main() { cout << "Podaj liczbe: "; int n; while( !( cin >> n ) ||( n > 9 || n < 2 ) ) { cout << "Aha. To nie jest poprawna liczba. Sprobuj jeszcze raz." << endl; cin.clear(); cin.sync(); } n *= 20; n += 9; bool * arr = new bool[ n ]; for( int i = 0; i < n; i++ ) { arr[ i ] = false; } for( int i = 4; i < n; i += 2 ) { arr[ i ] = true; } int s = static_cast < int >( sqrt( static_cast < double >( n ) ) ); for( int i = 2; i < s; i++ ) { if( !arr[ i ] ) { int j = i * i; while( j < n ) { arr[ j ] = true; j +=( i * 2 ); } } } int j = 0; int foo =(( n - 9 ) / 20 ); int bar = foo * 10; for( int i = foo; j < bar; i++ ) { if( arr[ i ] ) { cout << i << endl; j++; } } cin.sync(); cin.get(); delete[] arr; } |
|
manfred |
» 2009-02-07 10:27:58 A to ci wałek*, bowiem sitko można nieco zoptymalizować, a przykład masz w moim kodzie :D.
* - a może "ale wałek", bo jeszcze ktoś nie zrozumie... |
|
« 1 » |