View previous topic :: View next topic |
Author |
Message |
coderpp
Joined: 20 Aug 2005 Posts: 167 Location: Rīga, Koknese, Gajiena
|
Posted: Mon Dec 03, 2007 6:45 pm Post subject: Palīdziet izdomāt algoritmu - Ciparu apvienošana. |
|
Ir doti vairāki cipari. Man vajag atrast/dabūt visas iespējamās kombinācijas apvienojot ciparus.
Piemērs:
Dotie skaitļi: 3 - 4 - 2 - 8 - 1 - 6
Kombinācijas:
3 - 42 - 8 - 16
34 - 28 - 16
342 - 8 - 1 - 6
3 - 4281 - 6
........
3 - 4 - 2 - 8 - 16
342816 |
|
Back to top |
|
|
Storm
Joined: 11 Apr 2006 Posts: 742
|
Posted: Mon Dec 03, 2007 7:12 pm Post subject: |
|
vaajpraats, taas buus diezgam pamatiigs algo xD variaacijas tur ir lojoooti daudz vai 12 != 21? xD
P.S Pastaasti kam tev to vajag? Varbuut ir daudz vienkaarsaaks variants kaa panaakt veelamo effektu... (es ceru ka tas nav tavs maajasdarbs? ) |
|
Back to top |
|
|
Tenjou
Joined: 22 Nov 2005 Posts: 275
|
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Mon Dec 03, 2007 9:17 pm Post subject: |
|
Algoritms tur nav pamatīgs. Nedaudz pamodifcētas vienkāršas permutācijas vajag pārlasīt. Tenjou pareizu vien liku iedeva, sāc ar to, ka saproti kā tur to dara. |
|
Back to top |
|
|
coderpp
Joined: 20 Aug 2005 Posts: 167 Location: Rīga, Koknese, Gajiena
|
Posted: Sun Dec 09, 2007 1:54 am Post subject: |
|
Luk sads brinums man sanaca:
Code: |
type
StrArray = array of string;
IntArray = array of integer;
procedure FindNumberCombinations(var combination:StrArray; digit:IntArray);
type
lvl = record
start:integer; // Norāda ar kuru ciparu sākas līmenis
pos:integer; // Norāda ar kuru ciparu jāsāk apvienot cipari
len:integer; // Norāda cik daudz ciparu jāapvieno
number:string; // Apvienotie cipari
end;
var
level:array of lvl; // Līmeņu masīvs
digits:integer; // Ciparu skaits
count:integer; // Skaitam cik kombinācijas atrastas
active:integer; // Norāda līmeni ar kuru strādājam
i, j:integer; // Cika skaitītāji
begin
digits := Length(digit); // Uzzinam ar cik cipariem strādāsim
SetLength(level, (digits div 2) + 1); // Izrēķinam cik līmeņi būs vajadzīgi
level[0].start := 1;
level[0].len := 0;
level[0].pos := 1;
level[0].number := '';
count := 0; // Sākumā mums nav nevienas kombinācijas
active := 0; // Sākam ar 0. līmeni
// Sākam meklēt kombinācijas
while level[0].len < digits do
begin
// Ja aktīvais līmenis nav 0
if active > 0 then
begin
// Ja ši līmeņa sākums nav vienāds ar iereikšējā līmeņa pozīciju + garums
if level[active].start <> level[active - 1].pos + level[active - 1].len then
begin
// Pārējos līmeņos manam sākuma un pozīcijas vietu
level[active].start := level[active - 1].pos + level[active - 1].len;
level[active].pos := level[active].start;
level[active].len := 2;
end;
level[active].number := '';
end
else
begin
// 0. līmenī tikai manīsim garumu (ciparu skaitu)
level[active].start := 1;
level[active].pos := 1;
level[active].len := level[active].len + 1;
level[active].number := '';
end;
count := count + 1; // Norādam ka būs vēlviena kombinācija
SetLength(combination, count); // Palielinam masīvu
combination[count - 1] := '';
// Apvienojam ciparus
for i:=level[active].pos to level[active].pos + level[active].len - 1 do
level[active].number := level[active].number + IntToStr(digit[i - 1]);
// Izveidojam kombināciju
for i:=0 to active do
begin
// Ja sākums un pozīcija nav vienādi, tad starpā būs viens vai vairāki cipari
if level[i].start <> level[i].pos then
for j:=level[i].start to level[i].start + (level[i].pos - level[i].start) - 1 do
combination[count - 1] := combination[count - 1] + IntToStr(digit[j - 1]) + ' ';
// Starp iegūtajiem skaitļiem saliekam atstarpes
combination[count - 1] := combination[count - 1] + level[i].number + ' ';
end;
// Pieskaitam pēdējos ciparus, ja tādi ir
for i:=level[active].pos + level[active].len to digits do
combination[count - 1] := combination[count - 1] + IntToStr(digit[i - 1]) + ' ';
// Ja vēl ir palikuši 2 vai vairāk cipari, tad veidojam vēlvienu līmeni
if level[active].pos +level[active].len - 1 <= digits - 2 then
begin
active := active + 1;
end
// Ja ir palicis tikai viens cipars, tad palielinam ši līmeņa pozīciju
else if level[active].pos + level[active].len - 1 = digits - 1 then
begin
level[active].pos := level[active].pos + 1;
end
// Ja vairāk nav ciparu un sākums nav vienāds ar pozīciju, tad palielinam garumu
else if (level[active].pos + level[active].len - 1 = digits) and (level[active].pos <> level[active].start) then
begin
level[active].pos := level[active].start;
level[active].len := level[active].len + 1;
end
// Ja vairāk nav ciparu un sākums ir vienāds ar pozīciju, tad ejam vienu līmeni atpakal. Tad palielinam pozīciju
else if (level[active].pos + level[active].len - 1 = digits) and (level[active].pos = level[active].start) then
begin
active := active - 1;
if active >=0 then
level[active].pos := level[active].pos + 1;
for i:=active + 1 to High(level) do
level[i].start := -1;
end;
end;
level := nil;
end; |
|
|
Back to top |
|
|
Storm
Joined: 11 Apr 2006 Posts: 742
|
Posted: Sun Dec 09, 2007 1:39 pm Post subject: |
|
Skaisti! Ja driikst zinaat, kam tas ir domaats? |
|
Back to top |
|
|
coderpp
Joined: 20 Aug 2005 Posts: 167 Location: Rīga, Koknese, Gajiena
|
Posted: Mon Dec 10, 2007 4:22 pm Post subject: |
|
Tā bija daļa no uzdevuma skolā. Bija jātrod skaitļu ciparu kombinācijas, pēc tam iegūtie skaitļi jāsaskaita vai jāatņem, lai iegūtu kādu noteiktu skaitli. |
|
Back to top |
|
|
|