Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1
Zdravím, prosím o pomoc s následujícím zadáním příkladu v PASCALU ;-)
"Určete maximální hodnotu, která se v zadané posloupnosti vyskytuje pouze jedenkrát."
tzn.
zadám N čísel (např. 6) potom zadám
2 1 4 4 2 8
a spravným výsledekem bude 8 protože je nejvyšší a vyskytla se jen jednou
Děkuji za pomoc s vytvořením kódu
Offline
Ahoj! Nejprve si setřiď pole např. quicksortem (nevím, jestli je taková funkce přímo v pascalu). Tím se ti v časo O(N*log2N) v poli dostanou vedle sebe všechny stejné hodnoty, např:
zadání: 2 1 4 4 2 8
po setřízení: 1 2 2 4 4 8
Nyní toto pole procházej z té strany, kde je nevyšší číslo (v mém případě od konce). To pole procházej dokud nenajdeš číslo, které se v poli vyskytuje pouze 1×. V programu neověřuju situaci, kdy je hledané číslo nejmenším číslem nebo žádné takové číslo neexistuje:
var N, index : integer;
pole : array[1..10000] of integer;
begin
readln(N);
setřiď prvky pole vzestupně;
index := N;
while index >= 1 do {dokud nebylo nalezeno řešení}
begin
if pole[index] != pole[index-1] then {vlevo je jiná hodnota - bylo nalezeno řešení}
begin
writeln(pole[index]);
index := 0;
end
else {více stejných hodnot - nalezni první jinou hodnotu vlevo}
begin
while pole[index] == pole[index] do
index := index-1;
index := index-1;
end;
end;
end.Pokud tomu nerozumíš, ozvi se.
Offline
↑ vojta01:
Ahoj! díky moc za snahu pomoci, ale jsem asi marný případ :) cca všemu rozumím co jsi napsal, ale např. nechápu co ve zdrojáku je "!" k té řadící metodě jsem našel tento
kód
Procedure Rozdel(var i,j:integer;L,R:integer);
var X:integer;
begin {Rozdel}
i:=L;j:=R;
X:=A[(i+j)div 2]; {urcim delici hodnotu}
repeat
while A[i] < x do i:=i+1;
while A[j] > x do j:=j-1;
if i < = j then begin
A[i]:=:A[j];
i:=i+1;
j:=j-1;
end;
until i>j;
end; {Rozdel}
Procedure QuickSort(L,R:integer);
var i,j:integer;
begin {QuickSort}
Rozdel(i,j,L,R);
if L < j then QuickSort(L,j); {levy interval}
if i < R then QuickSort(i,R); {pravy interval}
end; {QuickSort}
Procedure NonRecQuickSort(L,R:integer);
var i,j:integer;
begin {NonRecQuickSort}
SInit(S);
Push(S,L);
Push(S,R);
while not Sempty(S) do begin
Top(S,R);Pop(S);
Top(S,L); Pop(S);
while L (j-L)then begin
Push(S,i);
Push(S,R);
R:=j;
end else begin
Push(S,L);
Push(S,j);
L:=i;
end; {else}
end; {while}
end; {while}
end; {NonRecQuickSort}jak toho mám využít, ale netuším TAKŽE POKUD BY JSI MI S TÍM JEŠTĚ POMOHL, BUDU TI VELMI VELMI VDĚČEN :)
P.S. Jdu to zkusit vecpat, ale jak říkám, již 3dny s tím válčím a nic :(
Offline
↑ paces:
Na quick sort se vybodni. Jde jenom o to seradit to pole (idealne sestupne) a pak ho od zacatku prochazet. V momente kdy narazis na cislo, ktery se lisi od nasledujiciho cisla v poli mas to co si chtel a koncis.
Myslim si, ze casova slozitost razeni je asi to posledni co te zajima :) Serad to normalne bubble sortem...
Jinak jak si se ptal co znamena != tak to je "nerovna se" z jinyho jazyka (treba java). Ma tam byt <>
Offline
Jo, použil jsem částečně céčkovskou syntaxi, patří tam:
if pole[index] <> pole[index-1]
while pole[index] = pole[index] do
K tomu quicksortu: Myšlenka tohoto algoritmu spočívá v setřízení zadaného pole. Je jedno, jaký třídící algoritmus použiješ, bubble sort je jednoduchý na naprogramování, ale zase je výrazně pomalejší než qicksort, mergesort a heapsort.
Já jsem navrhl quicksort také proto, že v C/C++ je k dispozici funkce qsort().
Offline
↑ vojta01:
Mám něco jako /následující/ ale háda se mi vše možné PROSÍM O RADU :)
var index : integer;
const N = 10000;
type Pole = array[1..10000] of integer;
var i:integer;
A:Pole;
{procedure BublinkoveTrideni}
procedure BublinkoveTrideni(var A: Pole);
var i,j: integer; {indexy prvku}
X: integer; {pro vymenu prvku}
begin
for i:=2 to N do
for j:=N downto i do
if A[j-1] > A[j] then {vymenit sousedni prvky}
begin X:=A[j-1]; A[j-1]:=A[j]; A[j]:=X end
end; {procedure BublinkoveTrideni}
begin
readln(N);
begin
writeln('Zadej tridena cisla:');
for i:=1 to N do read(A[i]);
BublinkoveTrideni(A);
writeln('Setrideno:');
for i:=1 to N do write(A[i]:5)
end;
index := N;
while index >= 1 do {dokud nebylo nalezeno řešení}
begin
if A[index] <> A[index-1] then {vlevo je jiná hodnota - bylo nalezeno řešení}
begin
writeln(A[index]);
index := 0;
end
else {více stejných hodnot - nalezni první jinou hodnotu vlevo}
begin
while A[index] = A[index] do
index := index-1;
index := index-1;
end;
end;
end.Offline
N máš definovanou jako konstantu (const N = 10000;), proto nemůžeš do N načítat číslo (readln(N);).
Konstatnu N změň na proměnnou N typu integer.
Dále jsem udělal chybu na řádku "while A[index] = A[index] do", patří tam "while A[index] = A[index-1] do".
Testoval jsem to ve FPC a funguje to.
Offline
Stránky: 1