Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Pascal wczytanie do tablicy 3-cyfrowych liczb

zabujcasnuw 10 Kwi 2010 10:59 2286 17
  • #1 10 Kwi 2010 10:59
    zabujcasnuw
    Poziom 8  

    Witam mam pewien problem, otóż od kilku dni próbuje rozwiązać zadanie z informatyki, brzmi ono następująco:

    Napisać program, który znajdzie wszystkie trójki liczb (dodatnich, mniejszych od 20), których suma jest liczbą pierwszą.

    Problem polega na tym, że nie wiem jak do tablicy by wprowadzić te trójki liczb.
    Próbowałem funkcji randomize ale w tablicy nie wypisywało tych wszystkich trójek, albo wypisywało ich w nadmiarze.
    Proszę o pomoc.

    0 17
  • Pomocny post
    #2 10 Kwi 2010 11:08
    Dżyszla
    Poziom 42  

    A czy kolega rozumie w ogóle zadanie?
    Masz znaleźć takie trójki liczb, których suma...
    czyli sprawdzamy
    1+1+1 = 3 - OK
    1+1+2 = 4 - :(
    1+1+3 = 5 - OK
    1+1+...
    1+1+19 = 21 - :(
    1+2+1 = 4 - :(

    czyli masz stworzyć de facto tablicę (jesli już chcesz takową) o szerokości 3 i długości wynikającej z kombinacji liczb, a następnie wyznaczać sumę i sprawdzać, czy jest liczbą pierwszą...

    Oczywiście zadanie można uprościć tylko do wyznaczania liczb x1>=x2>=x3, gdyż permutacja tej trójki także będzie dawała ten sam wynik sumy.

    0
  • #3 10 Kwi 2010 13:13
    zabujcasnuw
    Poziom 8  

    Dziękuję za pomoc :)
    Ja cały czas myślałem że liczby w tej trójce liczb nie mogą się powtarzać dlatego mi nie wychodziło:)

    0
  • #4 10 Kwi 2010 13:36
    arnoldziq
    Moderator Programowanie

    W zadaniu nic nie było o powtarzaniu się liczb.
    Zadanie jest stosunkowo proste.
    Musisz zrobić 3 pętle od 1 do 19, sumować ich wartości i sprawdzić czy suma jest liczbą pierwszą.
    Jedyny problem jaki możesz napotkać to wyeliminowanie trójek, w których liczby się powtarzają.
    Np.
    1+9+7 = 17
    7+1+9 = 17
    Co prawda na ten temat nic w zadaniu nie ma, ale spodziewam się że nauczyciel może się do tego przyczepić. ( Ja bym się przyczepił :) )
    BTW: Funkcji losowych raczej bym w to zadanie nie angażował.

    0
  • #6 10 Kwi 2010 13:48
    arnoldziq
    Moderator Programowanie

    Faktycznie, to da pożądany rezultat.
    Jednak, może należałoby stworzyć dwie wersje tego programu ?
    Jedną z wykluczaniem powtarzających się liczb i drugą, która pokazuje dokładnie wszystkie wyniki.
    Zadanie mówi :

    Cytat:
    Napisać program, który znajdzie wszystkie trójki liczb...

    0
  • #8 10 Kwi 2010 21:41
    zabujcasnuw
    Poziom 8  

    Masakra nie mogę dojść jak napisać ten program czy ktoś może mi pomóc?
    chce żeby to mi się wyświetlało mniej więcej tak jak napisał to Dżyszla, tylko żeby same trójki liczb co są liczbami pierwszymi.

    0
  • #10 10 Kwi 2010 22:25
    zabujcasnuw
    Poziom 8  

    Zrobiłem funkcje do liczb pierwszych ale jej nie upraszczałem bo na razie nie mam czasu. Teraz program wygląda tak:

    Code:
    program sumatrujek;
    

    {$APPTYPE CONSOLE}

    uses
      SysUtils;

    var
      a,b,c,k,d:integer;
      p:real;
    function pierwsza(k:integer):integer;
      begin
        if k<4 then writeln(k)
          else if k=4 then exit
          else
             begin
             p:=sqrt(k)+1;
             d:=2;
             while (d<p) AND ((k mod d)<>0) DO d:=d+1;
             if (k mod d)=0 then exit
             else writeln(a,' + ',b,' + ',c,' = ',k);
          end;
      end;
    begin
      { TODO -oUser -cConsole Main : Insert code here }
    writeln('Wszystkie trujki liczb i ich sumy to:');
    for a:=1 to 19 do
        for b:=1 to 19 do
          for c:=1 to 19 do
            begin
              k:=a+b+c;
              pierwsza(k);
           end;
      readln;
    end.


    Tylko ze wyświetla mi po kilka razy ten sam wynik. Co mogę zrobić żeby tego nie robił?

    0
  • #12 10 Kwi 2010 22:29
    zabujcasnuw
    Poziom 8  

    Ok a jak mam zrobić żeby nie wyświetlało po kilka takich samych wyników?

    0
  • Pomocny post
    #13 10 Kwi 2010 22:33
    arnoldziq
    Moderator Programowanie

    Możesz spróbować w ten sposób :

    Code:
    program sumatrujek;
    

    {$APPTYPE CONSOLE}

    uses
      SysUtils;

    var
      a,b,c:integer;
    {**************************}
    function Czy_Liczba_pierwsza( x: integer) : boolean;
    var
     idx,licznik : integer;
    begin
     if (x=0) or (x=1) then {sprawdzamy czy podana liczba to 1 lub 0}
      begin
       Czy_Liczba_pierwsza:=false;
       exit;
      end;
     licznik:=0;
     for idx:=x downto 1 do {sprawdzamy dzielenie przez wszystkie liczby od X w dol}
       if (x mod idx)=0 then licznik:=licznik+1; {mamy jedno dzielenie calkowite}
     Czy_Liczba_pierwsza:=(licznik=2);  {zwraca prawde, jezeli sa tylko 2 dzielenia calkowite}
    end;
    {**************************}
    begin
    for a:=1 to 19 do
        for b:=1 to 19 do
          for c:=1 to 19 do
            begin
              if (Czy_Liczba_pierwsza(a+b+c)) and
                 (a<=b) and (b<=c) then
                 writeln(a,'+',b,'+',c,'=',a+b+c);
           end;
      readln;
    end.

    0
  • #14 10 Kwi 2010 22:42
    zabujcasnuw
    Poziom 8  

    chyba działa troszkę lepiej ale ciągle wyświetla po kilka tych samych sum.
    Pascal wczytanie do tablicy 3-cyfrowych liczb

    0
  • Pomocny post
    #16 10 Kwi 2010 23:29
    arnoldziq
    Moderator Programowanie

    :) Nie przekombinowałem, nie chciałem za bardzo komplikować :)
    Co nasz kolega odpowie w szkole, jak się go nauczyciel zapyta a dlaczego tak a nie od 1 do 19 ?
    Będzie masakra. :)

    0
  • Pomocny post
    #17 10 Kwi 2010 23:42
    Dżyszla
    Poziom 42  

    no to jeszcze mała optymalizacja wynikająca częściowo z założeń autora (tylko czemu pierwiastek, a nie połówka? To nie sito!), przy okazji znacznie wydajniejsza:

    Code:

    function Czy_Liczba_pierwsza( x: integer) : boolean;
    var
     idx : integer;
    begin
     if x in [0,1] then {sprawdzamy czy podana liczba to 0, 1}
      begin
       Czy_Liczba_pierwsza:=false;
       exit;
      end;
     Czy_Liczba_pierwsza:=true; {stan domyślny}
     if x=2 then exit; //jeśli 2 to nie srpawdzamy, bo jest liczbą pierwszą.
     for idx:=2 to x div 2 do {sprawdzamy dzielenie przez wszystkie liczby od 2 do pół x (wśród większych na pewno brak, na dole większe prawdopodob. trafienia)}
       if (x mod idx)=0 then begin
          Czy_Liczba_pierwsza:=false; //znaleziono dzielnik
          exit; //bo i po co szukać następnych?
       end;
    end;

    0
  • #18 11 Kwi 2010 09:22
    zabujcasnuw
    Poziom 8  

    Wielkie dzięki wszystkim za pomoc :)

    0