filon92 Napisano Listopad 30, 2012 Zgłoś Share Napisano Listopad 30, 2012 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 More sharing options...
olesio Napisano Listopad 30, 2012 Zgłoś Share Napisano Listopad 30, 2012 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 More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.