prosty kalkulator w delphi - pomocy

0

witam
ładnych pare lat nie babrałem się w delphi, a nawet jak się babrałem to nie szło najlepiej :P
i teraz potrzebuje pomocy w napisaniu prostego programu
a mianowicie ma to być kalkulator
jest 26 liczb np. 2626, 273, 1027...
ten kalkulator miałby te wszystkie liczby pododawać w każdej możliwej kombinacji
ALE interesują mnie tylko wyniki typu 1000, 2000, 3000 itd aż do 10000 <-- żeby mi je wyszukał.
np. 150+500+350=1000 <--taki wynik mi wyświetli,
150+540+350=1040 <-- tego mi nie wyświetli, bo szukam wyników tysięcznych (2000, 5000 itd.)
proszę o jakieś wskazówki, czy fragmenty kodu, nie wiem jak to jakoś logicznie połączyć
jeśli ktoś jest w stanie pomóc to byłbym bardzo wdzięczny. mam nadzieje że w sposób wystarczająco klarowny przedstawiłem o co mi chodzi.
pozdrawiam

0

zawsze dodaje trzy liczby czy moga byc dwie lub cztery...?
czy liczby moga sie powtarzac? np 250+250+250 ?

0

może dodawać obojętnie ile liczb (z puli dwudziestu sześciu liczb)

2626, 1456, 2652, 520, 936, 260, 2574, 364, 260, 2834, 1638, 1781, 2899, 2847, 2509, 273, 767, 923, 299, 169, 2873, 1235, 1027, 2405, 2275, 845

jak widać np. liczba 260 występuje 2 razy wiec tyle razy może być użyta
jest baza 26liczb, program wybiera liczby w roznych kombinacjach i szuka wyniku tysięcznego (1000, 2000, 3000... do 10000)

0
  1. generujesz wszystkie podzbiory (oprócz pustego) zbioru n elementowego (tutaj 26)
  2. w każdym takim zbiorze sumujesz wszystkie elementy
  3. jeśli suma mod 1000 wynosi 0 to wyświetlasz te elementy
0

zgubiłem się w punkcie 1.
nie podejrzewałem że to będzie tak skomplikowane

0

Niestety, będzie skomplikowane i czasochłonne.
Wszystkich podzbiorów będzie ponad 67 milionów, a dokładnie 2^26 - 1 (-1, bo oprócz pustego)

0

jest jakiś sens się w tym babrać, jeśli mam na to 10dni? wczoraj sobie przypomnialem jak zrobic prosty kalkulator, także nie wiem czy w 10dni nabiore takich umiejętności żeby mi wyszukał potrzebnych wyników

0
simplex napisał(a)

Niestety, będzie skomplikowane i czasochłonne.

No i niestety będę musiał odwołać, to co napisałem wcześniej. Powinienem bardziej wierzyć w możliwości obliczeniowe dzisiejszych komputerów. Mój komputer (wcale nie dzisiejszy, bo ma już ok. 8 lat) obliczył to w pół minuty.
Dla tych 26 przykładowych liczb z drugiego posta autora wątku wyszło 57 655 sum podzielnych przez 1000. Jako ciekawostkę dodam, że są to tylko dwie różne liczby - 13 000 oraz 26 000.

Poniżej algorytm, z którego korzystałem. Może nie jest optymalny, ale mam nadzieję, że jest poprawny

procedure TForm1.Button1Click(Sender: TObject);
const
  Tab: array[1..26] of Integer = (2626, 1456, 2652, 520, 936, 260,
                                  2574, 364, 260, 2834, 1638, 1781,
                                  2899, 2847, 2509, 273, 767, 923,
                                  299, 169, 2873, 1235, 1027, 2405,
                                  2275, 845);
var
  Suma, Ile: Integer;
  a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z: Boolean;
begin
  Ile:= 0;
  for a:= false to true do
   for b:= false to true do
    for c:= false to true do
     for d:= false to true do
      for e:= false to true do
       for f:= false to true do
        for g:= false to true do
         for h:= false to true do
          for i:= false to true do
           for j:= false to true do
            for k:= false to true do
             for l:= false to true do
              for m:= false to true do
               for n:= false to true do
                for o:= false to true do
                 for p:= false to true do
                  for q:= false to true do
                   for r:= false to true do
                    for s:= false to true do
                     for t:= false to true do
                      for u:= false to true do
                       for v:= false to true do
                        for w:= false to true do
                         for x:= false to true do
                          for y:= false to true do
                           for z:= false to true do begin
                             Suma:= 0;
                             if a then Inc(Suma, Tab[1]);
                             if b then Inc(Suma, Tab[2]);
                             if c then Inc(Suma, Tab[3]);
                             if d then Inc(Suma, Tab[4]);
                             if e then Inc(Suma, Tab[5]);
                             if f then Inc(Suma, Tab[6]);
                             if g then Inc(Suma, Tab[7]);
                             if h then Inc(Suma, Tab[8]);
                             if i then Inc(Suma, Tab[9]);
                             if j then Inc(Suma, Tab[10]);
                             if k then Inc(Suma, Tab[11]);
                             if l then Inc(Suma, Tab[12]);
                             if m then Inc(Suma, Tab[13]);
                             if n then Inc(Suma, Tab[14]);
                             if o then Inc(Suma, Tab[15]);
                             if p then Inc(Suma, Tab[16]);
                             if q then Inc(Suma, Tab[17]);
                             if r then Inc(Suma, Tab[18]);
                             if s then Inc(Suma, Tab[19]);
                             if t then Inc(Suma, Tab[20]);
                             if u then Inc(Suma, Tab[21]);
                             if v then Inc(Suma, Tab[22]);
                             if w then Inc(Suma, Tab[23]);
                             if x then Inc(Suma, Tab[24]);
                             if y then Inc(Suma, Tab[25]);
                             if z then Inc(Suma, Tab[26]);
                             if (Suma mod 1000 = 0) and (Suma <> 0) then begin
                               Inc(Ile);
                               Memo1.Lines.Add(IntToStr(Suma));
                             end;
                           end;
  Memo1.Lines.Add('Razem ' + IntToStr(Ile));
end;
0
simplex napisał(a)

Jako ciekawostkę dodam, że są to tylko dwie różne liczby - 13 000 oraz 26 000.

tego zdania nie lapie...
btw, mozna by chyba skrocic ten kod o kilka linijek dajac jeszcze jedna petle i tablice zamiast zmiennych abcd...

0

Cimak

  1. Wśród tych 57655 liczb (podzielnych przez 1000), które znalazł program, przewijają się tylko liczby 13000 i 26000. Innych nie ma. Ot taka ciekawa właściwość.
  2. Też pomyślałem na zastosowaniem tablicy zamiast 26 zmiennych, ale odpuściłem. Jakoś nic mi nie przychodziło do głowy
0

ogromne dzięki za pomoc!
jest możliwość, żeby taki program wyświetlił jaką kombinacje liczb użył, aby otrzymać np. wynik 13000?
szkoda że nie ma wyniku mniejszego lub równego 10000 ;/
jeszcze raz dzięki

0

Oczywiście, że jest możliwość i nie jest to wcale trudne

  • Deklarujesz dodatkową zmienną tekstową (np Tekst)
  • W odpowiednim miejscu przypisujesz jej łańcuch pusty (domyśl się w którym)
  • Modyfikujesz warunki if ... then (oczywiście każdy), aby zawierały dwie instrukcje. W tej drugiej instrukcji dodajesz do zmiennej Tekst to, o co powiększasz zmienną Suma (oczywiście zamienione na tekst). Dwie instrukcje, więc koniecznie begin ... end
  • Modyfikujesz instrukcję, która wyświetla sumę, aby wyświetlała Sumę i Tekst

Wiem, że lepszy byłby gotowiec, ale ostatecznie to Twój program.

0
simplex napisał(a)

Oczywiście, że jest możliwość i nie jest to wcale trudne

  • Deklarujesz dodatkową zmienną tekstową (np Tekst)
  • W odpowiednim miejscu przypisujesz jej łańcuch pusty (domyśl się w którym)
  • Modyfikujesz warunki if ... then (oczywiście każdy), aby zawierały dwie instrukcje. W tej drugiej instrukcji dodajesz do zmiennej Tekst to, o co powiększasz zmienną Suma (oczywiście zamienione na tekst). Dwie instrukcje, więc koniecznie begin ... end
  • Modyfikujesz instrukcję, która wyświetla sumę, aby wyświetlała Sumę i Tekst

Wiem, że lepszy byłby gotowiec, ale ostatecznie to Twój program.

a gdzie optymalizacja?
nawet jak suma nie bedzie podzielna przez 1000 to program bedzie wykonywal dodatkowe linijki kodu - przy tkaiej ilosci danych czas sie moze znacznie wydłużyć.
lepiej jest sprawdzic jakie liczby zsumowano dopiero wtedy gdy ich suma bedzie podzielna przez 1000.

0

od ostatniego posta mecze sie z tym delphi i nic ciagle jakies bledy, w koncu wyrzucilem ten delphi compilatior
prosiłbym o gotowca(jesli ktos mialby checi i czas) bo juz mi leb od tego wysiada, a program jest bardzo potrzebny
dzieki simplex za udostepneinie tego kodu
pozdrawiam

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