Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

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
Autor Wiadomość
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:

C/C++
#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?
P-176130
pekfos
» 2020-01-25 19:25:01
Zapisz i do nowej zmiennej.
P-176131
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:

C/C++
#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;
}
P-176229
pekfos
» 2020-02-11 17:32:13
C/C++
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:
C/C++
#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;
}
P-176230
« 1 »
  Strona 1 z 1