Skocz do zawartości

problem liczby pierwsze


filon92

Polecane posty

Witam chcę napisać program w którym użytkownik podaje liczbę naturalna a program liczy ile liczb pierwszych może powstać z cyfr tej liczby przy założeniu, że budując liczbę pierwszą każda z cyfr tej liczby może zostać użyta tylko raz, dajmy na to mając 991 9 możemy zabrać 2 razy a 1 raz. Lecz nie mam pomysłu jak to zrobić, czy mógłby ktoś go podsunąć? z góry dziękuję

Link do komentarza
Udostępnij na innych stronach

Wątek poleci za pewne i tak trafi do Kosza, za nieodpowiedni temat. Jednak jeśli dobrze zrozumiałem to dla liczby 991 chcesz sprawdzić czy liczbami pierwszymi są też 1 i 9, oprócz sprawdzenia wszystkich kombinacji cyfr jakie można ułożyć z liczby 991? Jeżeli tak to na pewno są inne algorytmy, ale ja bym zrobił trochę lamerski i łatwy do wygooglowania po źródła. Mianowicie najpierw w pętli konwertując każdą cyfrę z podanej liczby na string i dołączał bym do niej pod warunkiem, że sprawdzając funkcją Pos dla tego stringa czy już ona w nim występuje. I dodawał oczywiście wtedy kiedy nie występuje. Dla pozostałych zrobił bym kod jak poniżej z użyciem algorytmu dla Anagramów, wcześniej konwertując cała liczbę na string. Jeżeli chcesz to zrobić w konsoli albo w WinAPI bez użycia VCL oraz klasy TStringList to można zrobić dynamiczną tablicę stringów, do tego dorabiając własną funkcję IndexOf dla tej tablicy. Poniżej przykładowy kod na anagramy w VCL wklejony na szybko. Na pewno ktoś jeszcze coś bardziej profesionalnego tutaj Ci doradzi, bo moje rozwiązanie jest na pewno mało optymalne, ale z braku innych pomysłów tak właśnie ja bym kombinował. A i kod w oryginalne był prawidłowo sformatowany na dwuspacjowe wcięcia, ale jak widzę parser po wstawieniu totalnie go rozwalił, no trudno. Ale powinieneś raczej pojąć ideę.

unit main;
{$WARN UNSAFE_TYPE OFF}
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type
 TMainForm = class(TForm)
AnagramBtn: TButton;
WordsLB: TListBox;
WordEdit: TEdit;
procedure WordEditChange(Sender: TObject);
procedure AnagramBtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
 private
 public
WordsFound : integer;
 end;

var
 MainForm : TMainForm;

implementation
{$R *.dfm}
procedure Anagrams(const InString : string; StringList : TStrings);
procedure RecursePerm(const StrA, StrB: string; Len : integer; SL : TStrings);
var
 I : integer;
 A, B : string;
begin
 if (length(StrA) = Len) then
 begin
if (SL.IndexOf(StrA) = -1) then
begin
 	MainForm.WordsFound := MainForm.WordsFound + 1;
 	SL.Add(StrA);
 	Application.ProcessMessages;
end;
 end;
 for I := 1 to length(StrB) do
 begin
A := StrB;
B := StrA + A[i];
delete(A, I, 1);
RecursePerm(B, A, Len, SL);
 end;
end;
begin
 MainForm.WordsFound := 0;
 StringList.Clear;
 Application.ProcessMessages;
 RecursePerm('', LowerCase(InString), Length(InString), StringList);
end;
procedure TMainForm.WordEditChange(Sender: TObject);
begin
 AnagramBtn.Enabled := WordEdit.Text <> '';
end;
procedure TMainForm.AnagramBtnClick(Sender: TObject);
var
 SL : TStringList;
begin
 WordsLB.Clear;
 SL := TStringList.Create;
 Anagrams(WordEdit.Text, SL);
 WordsLB.Items.Assign(SL);
 SL.Free;
 SetForegroundWindow(Application.Handle);
 MessageBox(Application.Handle, PChar(('Done. Found words: ' + IntToStr(WordsFound))),
 PChar(Application.Title), MB_OK + MB_ICONINFORMATION);
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
 Application.Title := Caption;
end;

Pozdrawiam: olesio

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...