Wyszukiwarka liczb pierwszych z cyfr podanej liczby

Odpowiedz Nowy wątek
2011-10-13 20:52
0

Witam. Jestem początkującym programistą (czytaj pierwszy semestr studiów informatycznych) i mam pytanie do bardziej biegłych w tym temacie osób.
Jako że jestem początkujący (praktycznie zerowa znajomość delphi), potrzebuje pewnych wskazówek/pomocy przy napisaniu pewnego programu.
Treść zadania:

"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 wejciowego wzišć tylko raz."

Jako że jestem jak narazie ignorantem w kwestii programowania w Delphi (7), więc jedyne co udało mi się do tej pory stworzyć w kwestii tego programu to coś takiego:
"

program liczby_pierwsze_zanurzone;

    {$APPTYPE CONSOLE}

    uses
  Math,SysUtils;

var a,b,d,e,f,h,X,C,G : Integer;
begin
d:=10;
writeln('Podaj liczbe');
readln(a);
C:=1;
G:=10;
while(a>=G) do
  begin
  C:=C+1;
  G:=G*10;
  end;

begin
repeat
C:=C-1;

writeln((a / (Power(d, C))));
readln;
until C=0;
end;
  end.

"

Mój pomysł polega na tym, że - pierwsza pętla 'while' określa mi ile cyfr ma dana liczba, a pętla 'repeat ... until' dzieli mi dają liczbę przez kolejne(malejące) potęgi liczby 10. W ten sposób chciałem odseparować cyfry danej liczby, a następnie w bliżej nie znany mi sposób stworzyć maksymalną liczbę losowych połączeń(zbiorów) cyfr danej wcześniej liczby, bez powtórzeń, a ostatecznie sprawdzić czy owe 'zbiory' są liczbami pierwszymi.
Co do sprawdzenia czy dane liczby są pierwsze znalazłem już taki programik:
"

program Czy_Pier;

uses CRT;

var L:LongInt;
    i:LongInt;
    Jest:Boolean;

begin
  ClrScr;
  Jest:=True;
  Write('Podaj liczbe do sprawdzenia: ');
  ReadLn(L);
  for i:=2 to trunc(sqrt(L)) do If (L mod i)=0 then
  begin
    Jest:=false;
    break;
  end;
  if jest then Write(l,' jest liczba pierwszĄ!;-)')
  else Write(l,' nie jest liczbĄ pierwszĄ, bo dzieli sie przez: ',i);
  ReadLn;
end.

"
No... to teraz czas na wypisanie problemów na jakie napotkałem pisząc mój pierwszy program w delphi:

1)Jak uzyskać wynik całkowity (mam na myśli wynik pętli 'repeat ... until', ponieważ do tej pory wyświetla mi coś takiego 5.00000000000000E+0000)
2)Dlaczego znaku dzielenie '/' nie mogę zastąpić 'div' (ułatwiło by mi to sprawę... chyba) - wyskakuje błąd (mało istotne pytanie)
3)Jak potem wykorzystać otrzymane cyfry (tzn. jak je 'wziąć' i użyć do kolejnych działań)
4)Jak stworzyć losowe zbiory (pary/trójki/n-tki) cyfr uzyskanych w wyniku pętli 'repeat ... until' tak, żeby z liczby 123 stworzyło mi: 1,2,3,12,13,21,31 itp.

edytowany 1x, ostatnio: madmike, 2011-10-13 21:02

Pozostało 580 znaków

2011-10-13 23:36
0

Ja bym to napisał tak, że pobrał bym liczbę od użytkownika, sprawdził czy to na pewno całkowita liczba przu użyciu proceudry Val. Następnie zamienił liczbę na String poprzez IntToStr (moduł SysUtils), a później kodem który masz w załączniku stworzył listę anagramów mając dzięki temu kombinacje tej liczby, a później w pętli na otrzymanej liście konwertował string do liczby i sprawdzał czy jest ona pierwsza. Co do Twoich pytań, to pętla repeat until zmieni odpowiednio wartości użytych w niej zmiennych jeżeli były na nich przeprowadzone jakieś operacje, po jej zakończeniu możesz wyświetlić te zmienne o ile prawidłowo skonstrułowałeś warynek kończocy pętlę. Co do instrukcji div to można nią dzielić tylko liczby całkowite. Natomiast ilość miejsc po przecinku możesz ustalić tak:

program Project2;

{$APPTYPE CONSOLE}

var
  R : Real;
begin
  R := 3.1337;
  Writeln(R : 0 : 2);
  Readln;
end.

Widzę, że piszesz w konsoli, to musiał byś sobie przerobić mój kod z VCL pod konsolę, jeżeli napisany program ma być konsolowy. Z tworzenia kombinacji liczb nie jestem ekspertem, dlatego sposób z anagramem jest nieco lamerski, ale masz jakiś przykład, bo do tej pory nikt nie odpisał. Pewnie zrobią to później i polecą Tobie tutaj jakieś o wiele lepsze rozwiązanie niż moje próby pisane późną porą będąc zmęczonym i bawiąć się w miedzy czasie w tłumaczenie kodu z C na Delphi.


Pozostało 580 znaków

2011-10-14 01:12
0

Ciekawe rozwiązanie z tymi anagramami. Z tego co widzę, to gdyby udało mi się do tego programu dodatkowo zaimplementować ten mój programik, to wyświetlałby on kolejno anagramy kolejnych części liczby - gdy wpisze np 123, to wyświetla mi 1 , 12, 123, a ten program oprócz tego tworzyłby mi ich anagramy. Jednakże tutaj pojawiają się kolejne problemy:
0) Powiem wprost, nie mam pojęcia na jakiej zasadzie działa ten program - jak już wspomniałem moja znajomość delphi<0 (opiera się na kilku lekcjach sprzed 5 lat i ogranicza się do if'a)
1) Nie mam pojęcia jak zaimplementować ten mój programik
2) Nadal nie rozumiem jak użyć div'a, który przydałby mi się, bo wyniki dzielenia liczby przez kolejne(malejące) potęgi 10 są zaokrąglane w górę, a tego chciałbym akurat uniknąć

Napisałem - div dzieli liczby całkowite czyli typu integer, dla innych stosuje się operator "/" jako znak dzielenia. - olesio 2011-10-15 20:21

Pozostało 580 znaków

2011-10-14 12:39
0

http://rosettacode.org/wiki/Permutations#Pascal

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0