Program szukający liczby, która ma najwięcej dzielników ( liczby z przedziału podanego przez użytkownika ;) )
Ostatnio zmodyfikowano 2020-02-11 17:32
nequ13337 Temat założony przez niniejszego użytkownika |
Program szukający liczby, która ma najwięcej dzielników ( liczby z przedziału podanego przez użytkownika ;) ) » 2020-01-25 18:17:31 Witajcie. Mam za zadanie napisać program, szukający w przedziale liczby, która posiada najwięcej dzielników. Zmagam sie z tym problemem już dłuższy czas. Postanowiłem więc zasięgnąć po pomoc. Podsyłam mój kod: #include <iostream> #include <cstdlib> using namespace std;
int main() { int najwieksza = 0; cout << "Podaj dolny kraniec:" << endl; int dolny; cin >> dolny; cout << "Podaj gorny kraniec:" << endl; int gorny; cin >> gorny; int licznik = 0; for( int i = dolny; i <= gorny; i++ ) { for( int j = 1; j <= i; j++ ) { if( i % j == 0 ) licznik++; } cout << "liczba " << i << " ma " << licznik << " dzielnikow ;]" << endl; if( najwieksza < licznik ) najwieksza = licznik; licznik = 0; } cout << "Najwieksza liczba dzielnikow liczb z przedzialu to: " << najwieksza << endl; system( "pause" ); return 0; }
Jak widać, nie mam problemu z wypisaniem liczb, policzeniem liczby dzielnikow tych liczb. Jak jednak powiązać najwieksza liczbe dzielnikow wlasnie z liczbą, o której mowa w zadaniu? |
|
pekfos |
» 2020-01-25 19:25:01 Zapisz i do nowej zmiennej. |
|
mizie |
Rozwiązanie » 2020-02-11 15:40:55 Jeżeli zauważymy, że w danym przedziale więcej niż jedna liczba może mieć największą liczbę dzielników i wykorzystamy sugestię pekfosa to twój program może wyglądać następująco: #include <iostream> using namespace std;
int main() { int najwieksza { 0 }, licznik { 0 }, dolny, gorny; cout << "Podaj dolny kraniec przedzialu: "; cin >> dolny; cout << "Podaj gorny kraniec przedzialu: "; cin >> gorny; int elem = gorny - dolny + 1; int wyniki[ elem ][ 2 ]; for( int i = dolny; i <= gorny; i++ ) { for( int j = 1; j <= i; j++ ) if( i % j == 0 ) licznik++; wyniki[ i - dolny ][ 0 ] = i; wyniki[ i - dolny ][ 1 ] = licznik; if( najwieksza < licznik ) najwieksza = licznik; licznik = 0; } cout << "Najwieksza liczba dzielnikow to: " << najwieksza << endl; cout << "Liczby posiadajace najwieksza liczbe dzielnikow w podanym przedziale to:\n"; for( int i = 0; i < elem; i++ ) if( wyniki[ i ][ 1 ] == najwieksza ) cout << wyniki[ i ][ 0 ] << endl; system( "PAUSE" ); return 0; }
|
|
pekfos |
» 2020-02-11 17:32:13 int elem = gorny - dolny + 1; int wyniki[ elem ][ 2 ]; |
To nie jest poprawny sposób tworzenia tablic. Bardzo hojnie też rozporządzasz pamięcią - w przypadku pesymistycznym wszystkie liczby mają tyle samo dzielników? Bardzo łatwo by tu podać liczbę wystarczająco dużą, by programowi nie starczyło pamięci by nawet zacząć coś robić. Lepsze rozwiązanie: #include <iostream> #include <vector> using namespace std;
int main() { int najwieksza { 0 }, dolny, gorny; cout << "Podaj dolny kraniec przedzialu: "; cin >> dolny; cout << "Podaj gorny kraniec przedzialu: "; cin >> gorny; std::vector < int > wyniki; wyniki.reserve( 1024 ); for( int i = dolny; i <= gorny; i++ ) { int licznik = 0; for( int j = 1; j <= i; j++ ) if( i % j == 0 ) licznik++; if( licznik < najwieksza ) continue; if( licznik > najwieksza ) { najwieksza = licznik; wyniki.clear(); } wyniki.push_back( i ); } cout << "Najwieksza liczba dzielnikow to: " << najwieksza << endl; cout << "Liczby posiadajace najwieksza liczbe dzielnikow w podanym przedziale to:\n"; for( int i: wyniki ) cout << i << endl; return 0; } |
|
« 1 » |