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.

Delphi - liczby pierwsze - stworzyć zbiory

rogal180 03 Sty 2011 18:21 1740 8
  • #1 03 Sty 2011 18:21
    rogal180
    Poziom 11  

    Witam ,
    Mam problem w Delphi . Który brzmi :
    ''Napisz program znajdujący wszystkie liczby pierwsze, które można stworzyć z podzbiorów
    cyfr podanej liczby całkowitej.
    Przykład: pytamy ile liczb pierwszych można stworzyć z cyfr liczby 1379? Możemy znaleźć aż
    31 liczb pierwszych zanurzonych w liczbie 1379. Uwaga: budując liczbę pierwszą możemy każdą
    cyfrę ze zbioru wejściowego wziść tylko raz.''
    Napisałem coś takiego :

    Code:

        program liczby_pierwsze_zanurzone;

        {$APPTYPE CONSOLE}

        uses
          SysUtils;

        var i, c, b, a, n, x : Integer;
            r : array of Integer;


        begin
           writeln('Wpisz liczbe ...');
           readln(a);

           for i:=1 to a do
           begin
             x:=0;
             for n:=1 to i do
             begin
               if i mod n=0 then
               x:=x+1;
             end;
             if x=2 then
             // tutaj są już gotowe liczby pierwsze
             begin
               SetLength(r,i);
               b:=0;
               for c:=low(r) to high(r) do
               begin
                 b:=b+1;
               end;
             end;
             end;
             writeln('W liczbie ',a,' miesci sie ',b,' liczb pierwszych');
           readln;
        end.

    D

    0 8
  • #2 04 Sty 2011 12:01
    walek33
    Poziom 28  

    A jesteś pewien, że Twój kod liczy je tak jak założyłeś? Myślę, że nie, ale...

    Dodane:
    I jeszcze nurtuje mnie zasada według której doliczyłeś się 31.

    0
  • #3 04 Sty 2011 12:20
    redie
    Poziom 15  

    uhh, kod jest dziwny.
    Widzę, że liczysz z jakiegoś powodu ilość liczb pierwszych znajdujących się w przedziale od 1 do i, ale po co jest później ten warunek:

    Code:
    ...
    
    if x=2 then
    ...

    a później zmieniasz wielokrotnie rozmiar tabeli r, której i tak nigdzie nie wykorzystujesz, po co ona jest?

    Jak już poskładasz coś sensowniejszego to weź pod uwagę to, że nie ma sensu szukać liczb pierwszych od wartości 1 bo najmniejsza liczba pierwsza to 2.
    A w ramach optymalizacji dodam jeszcze że sprawdzanie czy liczba i jest podzielna przez n, gdzie n jest iteratorem pętli można wykonać w pętli o takiej:
    Code:
    for n:=1 to round(sqrt(i)) do
    
    ...

    czyli dochodząc tylko do wartości równej pierwiastkowi z danej liczby.

    0
  • #4 04 Sty 2011 13:41
    rogal180
    Poziom 11  

    1379 =1,3,7,9,13,17,19,31,37,39,71,73,79,91,93,97,137,139,173,179,191,197,317,319,371,379,391,397,713,719,731,739,791,793,913,917,931,937,971,973 = 40 wszystkich możliwości utworzenia z liczby 1379 .

    A teraz z tych liczb wybieramy tylko liczby pierwsze czyli : 3,7,13,17,19,31,37,71,73,79,97,137,139,173,179,191,197,317,379,397,719,739,937,971

    A jak to się ma do liczby 31 która rzekomo powinna wyjść ? Nie mam pojęcia .

    0
  • #5 04 Sty 2011 15:11
    walek33
    Poziom 28  

    Cytat:
    A jak to się ma do liczby 31 która rzekomo powinna wyjść ? Nie mam pojęcia

    To Ci pomogę.
    Twoje poszukiwane liczby to:

    3,7,13,17,19,31,37,71,73,79,
    97,137,139,173,179,193,197,317,379,397,
    719,739,937,971,1319,1973,3719,3917,7193,9137,
    9173.
    Po dychu w rządku +1 daje wynik 31. :D

    0
  • #6 04 Sty 2011 15:31
    rogal180
    Poziom 11  

    ehh , faktycznie .
    Tylko jak teraz mam ten zbiór wyznaczyć w Delphi . Najpierw wyznaczam liczby pierwsze :

    Code:

    program new14;

    {$APPTYPE CONSOLE}

    uses
      SysUtils,
      CRT;

    var i,a,n,x:Integer;

    begin
       writeln('Wpisz liczbe ...');
       readln(a);
       clrscr;
       for i:=1 to a do
           begin
           x:=0;
           for n:=1 to i do
               begin
               if i mod n=0 then
               x:=x+1;
               end;
           if x=2 then
           writeln(i);
           end;
       readln;
    end.

    Teraz przydała by się kolejna pętla która wyznaczy ten nieszczęsny zbiór liczb .
    Potem trzeba je porównać , jeżeli dane liczby się zgadzają to ją wyświetlić . Ma ktoś pomysł ?

    0
  • #7 04 Sty 2011 16:06
    walek33
    Poziom 28  

    I popełniasz drobny błąd. Twój kod nie znajdzie wszystkich liczb pierwszych zgodnych z założeniem. Trzymając się przykładowej 1379 musisz szukać liczb w zakresie 1 ÷ 9731 (choć 1 to nie liczba pierwsza).
    Myślę, że w pierwszej kolejności musisz po odczytaniu a posortować w niej cyferki malejąco. W ten sposób otrzymasz nową liczbę i będzie to koniec zakresu poszukiwań.

    0
  • #8 04 Sty 2011 18:31
    rogal180
    Poziom 11  

    tylko jak ustalić ten maksymalny zakres ?

    0
  • #9 04 Sty 2011 20:13
    walek33
    Poziom 28  

    Przecież już Ci podpowiedziałem:

    Cytat:
    ...posortować w niej cyferki malejąco...


    Dodane:
    A teraz z lekka łopatologiczne, bo nie wiem czy wiesz "co autor miał na myśli" skoro pytasz.
    Po przypisaniu wartości do a w wierszu:
    Code:
    readln(a); 

    musisz napisać kawałek procedury, która z cyfr składowych liczby przypisanej do a stworzy liczbę o wartości największej. Czyli jak to wcześniej napisałem najprostsze sortowanie poszczególnych cyfr danej liczby przypisanej do a w porządku malejącym załatwia sprawę. To jest górna wartość Twojego zakresu poszukiwań.

    0
  Szukaj w 5mln produktów