Dobrý den,mám problém s úkolem.............vůbec nevím jak na to..........Je dán počet vstupních hodnot N a dále posloupnost N čísel a1, a2, …, aN. Všechna zadaná čísla jsou celá , počet čísel N není větší než 10000. Určete, kolik různých hodnot se nachází v zadané posloupnosti. Například pro vstup ve tvaru
10
4 7 5 5 7 7 20 25 7 30
bude výsledkem číslo 6 pomoste pls
Fórum › Pascal
Pomoc DU
Muzes si treba udelat pole tolika booleanu, kolik muze byt v te posloupnosti maximalne cisel. Na zacatku ho naplnis hodnotami false. Pak projdes tu zadanou posloupnost a pro kazde cislo nastavis v poli bunku s timto indexem na true (pole[cislo]:=true). Nakonec spocitej, kolik mas v poli hodnot true a je to.
Moje stránka.
Pokud to budou integery (což jsem předpokládal), není problém udělat pole booleanů s indexem pokrývajícím celý rozsah integeru, do limitu 64KB na jednu proměnnou je to akorát. Není důvod šetřit pamětí, nic jiného ten program dělat nebude.
Ale jestli to budou longinty, tak máš pravdu. To se pak bude muset vyrobit nějaký seznam přímo těch čísel (pole bude stačit), který se vždycky po načtení nového čísla z posloupnosti projde a pokud v něm to číslo ještě není, tak se tam přidá. Nakonec se spočítá počet čísel v tom poli.
Moje stránka.
Buďto to můžeš řešit hrubou silou nebo v rukavičkách.
Hrubou silou znamená, že si uděláš pole 1..10000, budeš tam zapisovat nelezené prvky a pořád ho budeš procházet, jestli tam je prvek na vstupu. Jestli neni, tak ho tam přidáš a postup se opakuje. Algoritmus je jednoduchý, ale pomalý, protože čísla nejsou nijak tříděná a pole se většinou prochází zbytečně dlouho.
var data,prac:array[1..10000] of longint;
a,b,c,p:integer;
je_tam:boolean;
begin
write('Kolik zadas cisel? ');
readln(a);
for b:=1 to a do
begin
write('Zadej hodnotu c.',b,': ');
readln(data);
end;
{Data mame nactena, jdem je zpracovavat}
p:=0;
for b:=1 to a do
begin
je_tam:=false;
for c:=1 to p do
if prac[c]=data then begin je_tam:=true;Break;end;
if je_tam=false then
begin
inc(p);
prac[p]:=data;
end;
end;
writeln('Zadano bylo ',p,' ruznych hodnot.'#13#10'Tady jsou:');
for b:=1 to p do
write(prac,', ');
writeln(#8#8' '); {umaze posledni carku}
readln;
end.
V rukavičkách znamená, že přijímaná data budeš za pochodu řadit podle velikosti, takže procházení, jestli číslo už bylo, bude mnohem rychlejší. Na takovýhle postup se ale pole nehodí. Na to se používají binární vyhledávací stromy, a to je tak o tři levely obtížnější.
Už jsem to říkal Curovi, ať to v kódech zruší :smile20:
Pro čtenáře: tam, jak začíná to tučné, má být [ b ]:
readln(data); - správně readln(data[ b ]);
Pro pisatele: veškeré hranaté závorky pro jistotu vykládejte mezerami...
Moje stránka.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Pomoc.... nějaká chybka prosím pomoc - více v podrobném popisu — založil tkstudent
Pomoc, pomoc s úkolem (matice v Delphi) — založil maxikp
Moderátoři diskuze