|
[ Passwd @ 28.09.2005. 21:04 ] @
| Evo kako glasi zadatak:
Sjećate li se zadataka iz matematike kada ste morali između brojeva staviti znakove operatora kako bi dobili određeni broj? Sada je vaš zadatak postaviti operatore ‘+’, i ‘–‘ između četiri učitana broja, kako bi dobili peti. Ako se ne može dobiti taj peti broj, tada potražite kombinaciju kojom mu dolazite najbliže.
Ulazni podaci
S tipkovnice se učitava 5 cijelih brojeva (svi će biti između 0 i 1000, uključivo).
Izlazni podaci
Na ekran treba ispisati kako se pomoću prva četiri broja i operacija ‘+’ i ‘-‘ može dobiti peti, a u slučaju da se ne može dobiti, ispisati kombinaciju kojom mu se najbliže dolazi. Ukoliko postoji više kombinacija da se dobije potreban rezultat, dovoljno je ispisati jednu.
Primjeri:
ulaz: 1 1 1 1 4
izlaz: 1+1+1+1=4
ulaz:11 3 6 9 5
izlaz:11 – 3 + 6 – 9 = 5
Evo koda:
Code:
program zad3;
uses crt;
var br1,br2,br3,br4,br5,x,br,min:integer;
s:array [1..18] of string;
s1,s2,s3:array [1..18] of string;
rez,ost:array [1..18] of integer;
begin
clrscr;
readln(br1,br2,br3,br4,br5);
rez[1]:=br1+br2+br3+br4;
s1[1]:='+';
s2[1]:='+';
s3[1]:='+';
rez[2]:=br1+br2+br3-br4;
s1[2]:='+';
s2[2]:='+';
s3[2]:='-';
rez[3]:=br1+br2-br3-br4;
s1[3]:='+';
s2[3]:='-';
s3[3]:='-';
rez[4]:=br1-br2-br3-br4;
s1[4]:='-';
s2[4]:='-';
s3[4]:='-';
rez[5]:=br1-br2+br3+br4;
s1[5]:='-';
s2[5]:='+';
s3[5]:='+';
rez[6]:=br1-br2-br3+br4;
s1[6]:='-';
s2[6]:='-';
s3[6]:='+';
rez[7]:=br1-br2+br3-br4;
s1[7]:='-';
s2[7]:='+';
s3[7]:='-';
rez[8]:=br1+br2-br3+br4;
s1[8]:='+';
s2[8]:='-';
s3[8]:='+';
for x:=1 to 9 do
begin
if rez[x]=br5 then begin
writeln(br1,'',s1[x],'',br2,'',s2[x],'',br3,'',s3[x],'',br4,'=',br5);
readln;
exit;
end;
end;
for x:=1 to 9 do
begin
if rez[x]>br5 then
begin
ost[x]:=rez[x]-br5;
end
else
begin
ost[x]:=br5-rez[x];
end;
end;
min:=100;
for x:=1 to 8 do
begin
if ost[x]<min then min:=ost[x];
end;
for x:=1 to 8 do
begin
if ost[x]=min then begin
writeln(br1,'',s1[x],'',br2,'',s2[x],'',br3,'',s3[x],'',br4,'=',rez[x]);
readln;
exit;
end;
end;
end.
Naravno, meni se kod cini sascim u redu i trebalo bi po mome da radi (i radi na nekim primjerima) ali konkretno ne radi dobro kod ovoga:
ulaz:1 2 3 4 5
svaki savjet dobro dodje 
poz |
[ Srki_82 @ 28.09.2005. 22:07 ] @
Pa... na brzaka sam pogledao (nisam gledao sta program radi) i vidim da dodajes vrednosti promenljivoj rez od 1 do 8, a posle trazis od 1 do 9 :) Nije ni cudo sto ne radi :)
Posle ost malo trazis od 1 do 8, a malo od 1 do 9. Imas 9 kombinacija sa operatorima (2^3 + 1) tako da uvek moras da radis sa 9 mogucih vrednosti.
[ milika @ 29.09.2005. 05:41 ] @
Srki gresis 8komb treba nema tu +1
evo coda koji radi (delphi console)
Code:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var br1,br2,br3,br4,br5,x,br,min:integer;
s:array [1..8] of string;
s1,s2,s3:array [1..8] of string;
rez,ost:array [1..8] of integer;
begin
//clrscr;
readln(br1,br2,br3,br4,br5);
rez[1]:=br1+br2+br3+br4;
s1[1]:='+';
s2[1]:='+';
s3[1]:='+';
rez[2]:=br1+br2+br3-br4;
s1[2]:='+';
s2[2]:='+';
s3[2]:='-';
rez[3]:=br1+br2-br3-br4;
s1[3]:='+';
s2[3]:='-';
s3[3]:='-';
rez[4]:=br1-br2-br3-br4;
s1[4]:='-';
s2[4]:='-';
s3[4]:='-';
rez[5]:=br1-br2+br3+br4;
s1[5]:='-';
s2[5]:='+';
s3[5]:='+';
rez[6]:=br1-br2-br3+br4;
s1[6]:='-';
s2[6]:='-';
s3[6]:='+';
rez[7]:=br1-br2+br3-br4;
s1[7]:='-';
s2[7]:='+';
s3[7]:='-';
rez[8]:=br1+br2-br3+br4;
s1[8]:='+';
s2[8]:='-';
s3[8]:='+';
for x:=1 to 8 do
begin
if rez[x]=br5 then begin
writeln(br1,'',s1[x],'',br2,'',s2[x],'',br3,'',s3[x],'',br4,'=',br5);
readln;
exit;
end;
end;
for x:=1 to 9 do
begin
if rez[x]>br5 then
begin
ost[x]:=rez[x]-br5;
end
else
begin
ost[x]:=br5-rez[x];
end;
end;
min:=1000;
for x:=1 to 8 do
begin
if ost[x]<min then min:=ost[x];
end;
for x:=1 to 8 do
begin
if ost[x]=min then begin
writeln(br1,'',s1[x],'',br2,'',s2[x],'',br3,'',s3[x],'',br4,'=',rez[x]);
end;
end;
readln;
end.
[ Srki_82 @ 29.09.2005. 08:49 ] @
Ups... pazi stvarno :)
Nego... sta je poenta proveravati rez[9] kad tu nema nista upisano, a i rez je deklarisan od 1 do 8!? Mislim... nema logike!?
[ Passwd @ 29.09.2005. 09:29 ] @
Citat: Srki_82:
Nego... sta je poenta proveravati rez[9] kad tu nema nista upisano, a i rez je deklarisan od 1 do 8!? Mislim... nema logike!?
Ma znam za to, prvo sam napravio od 1 do 8 provjeru, ali posto nije radilo a trebalo je da radi sa zadnjom kombinacijom (8-om) te sam onda bezveze prosirio jer nisam vidio gresku nigdje
Sad jos imam par pitanja, koji je najbrzi algoritam za sortiranje i kako radit sa brojevima koji imaju preko 100 znamenaka 
[ Srki_82 @ 29.09.2005. 10:43 ] @
Kazu da je najbrzi quicksort. Imas primer za tu vrstu sortiranja u primerima koji idu sa TP7.
Za uzasno velike brojeve moras napraviti sam svoj sistem cuvanja podataka i funkcije koje ce obavljati matematicke operacije. Najlaksi nacin ti je da koristis niz bcifara i da tako cuvas brojeve. Jeste da ces koristiti ceo bajt za cuvanje samo jedne cifre pa ces tako prakticno baciti 4 bita jer su ti samo 4 bita dovoljna da oznacis cifru iz dekadnog sistema, ali bar neces komplikovati.
BTW: Nabavi Borland Pascal 7 ako mozes... mnogo je mocniji od Turbo Pascal 7 (mozes da prvis dll-ove, da radis sa Win registry i jos mnogo stvari ;) )
[ Passwd @ 29.09.2005. 20:04 ] @
Malo su pretjerali, vremensko ogranicenje 1 sekunda po izvrsavanju nekog zadatka, postavljena ogranicenja na heap i stack memoriju, ne smjes koristit opce rijec uses......
dal bi program mozda brze izvodio operacije ako bi izravno pristupao procesoru, tj. pisao kod u asm-u?
[ Passwd @ 29.09.2005. 20:59 ] @
Il evo i ovaj zadatak me zaxexava 
Opet mislim da je kod u redu (trebao bi radit do 99 znakova kriptirane rijeci), ali zapravo ne radi, tj. ne ispisuje rijec...
evo kako glasi zadatak:
Naši junaci Mirko i Slavko počeli su se baviti arheologijom i dakako ubrzo nabasali na nevjerojatno otkriće. Njih dvoje su pronašli ostatke drevne civilizacije koja se, kao i mi, služila latinicom i arapskim brojkama. Ta civilizacija je često koristila jednostavne kriptirane poruke koje Mirko i Slavko mogu čitati ali im to oduzima previše vremena, pa je red na vama da im osigurate program koji će to činiti umjesto njih.
Sistem kriptiranja je vrlo jednostavan: slova nisu na svojim mjestima nego je iza svakog slova navedeno mjesto na kojem bi se ono trebalo nalaziti, primjerice: r3n1p2 znači da bi se slovo r trebalo nalaziti na trećem mjestu, slovo n na prvom a slovo p na drugom, te dešifrirana riječ glasi npr.
Sa tastature treba unjeti kriptiranu riječ, a zatim na ekran ispisati dekriptiranu.
Riječi će se sastojati isključivo od malih slova engleske abecede, te brojeva. Kriptirana riječ neće biti duža od 100 znakova.
PRIMJERI
ULAZ
u2b1
IZLAZ
bu
ULAZ
d1a3v2
IZLAZ
dva
ULAZ
e6r7r2p1m4i3j5
IZLAZ
primjer
evo kod:
Code:
program zadatak2;
uses crt;
var kript,rijec,s,st,pro:string;
sl:char;
broj,br,g,x,y:integer;
begin
clrscr;
s:='';
readln(kript);
for x:=1 to length(kript) do
begin
for sl:='a' to 'z' do
begin
if kript[x]=sl then begin
for y:=1 to 9 do
begin
pro:='';
str(y,pro);
if kript[x+1]=pro then begin
str(y,st);
s:=s+st;
end;
end;
for y:=1 to 9 do
begin
pro:='';
str(y,pro);
if kript[x+2]=pro then begin
str(y,st);
s:=s+st;
end;
end;
val(s,broj,g);
rijec[broj]:=kript[x];
end;
end;
end;
for x:=1 to length(rijec) do
write(rijec[x]);
readln;
end.
naravno, svaki odgovor/uputa dobro dodje
[Ovu poruku je menjao Passwd dana 29.09.2005. u 22:00 GMT+1]
[ Celebmegil @ 29.09.2005. 22:50 ] @
Mislim da bi ovo trebalo da radi
Code:
program Zad;
var
niz:array[0..1000]of char;
ulaz:string;
izlaz:string;
i,j,d,l:integer;
c:char;
begin
readln(ulaz);
l:=0;
i:=0;
d:=0;
repeat
inc(i);
case ulaz[i] of
'0': begin d:=d*10; end;
'1': begin d:=d*10;d:=d+1; end;
'2': begin d:=d*10;d:=d+2; end;
'3': begin d:=d*10;d:=d+3; end;
'4': begin d:=d*10;d:=d+4; end;
'5': begin d:=d*10;d:=d+5; end;
'6': begin d:=d*10;d:=d+6; end;
'7': begin d:=d*10;d:=d+7; end;
'8': begin d:=d*10;d:=d+8; end;
'9': begin d:=d*10;d:=d+9; end;
else
begin
niz[d]:=c;
inc(l);
d:=0;
c:=ulaz[i];
end;
end;
until i=length(ulaz);
if d<>0 then niz[d]:=c;
izlaz:='';
for i:=1 to l do izlaz:=izlaz+niz[i];
writeln(izlaz);
end.
A ogranicenja po ACM pravilim uopste nisu preterana jer se traze algoritmi sa sto boljom vremenskom i prostornom optimizacijom.
[ Srki_82 @ 01.10.2005. 14:24 ] @
Ovo resenje ima zastitu od pogresnog unosa sifrirane reci tako da ces biti bezbedan cak i ako namerno budu ubacili neku pogresnu rec da bi ti zeznuli program. Moguce greske za koje se vrsi provera je pogresan raspored oznaka... npr. ako umesto c1o3a2 unesu 1c3o2a, ili ako na primer imesto slova pokusaju da stave brojeve 112233. Druga greska je pokusavanje unosenja broja veceg od 99 npr. c100a99b88. Treca greska na koju se obraca paznja je unosenje koda koji nema podatke za sve karaktere... primer: a2o3. Nigde ne postoji podatak za karakter broj 1. Poslednja zastita je pokusavanje unosenja podataka vise puta za jedan isti karakter. Primer: c1a2o3f2. Dva puta se pojavljuje podatak za karakter pod rednim brojem 2. To je to.
Code: program Passwd_Zad2;
function DecodeData(S: String): String;
var
R: String;
I, N, dS: Byte;
C: Char;
begin
I := 1;
FillChar(R, SizeOf(R), 0);
dS := 0;
while I < Length(S) do
begin
if S[I] in ['0'..'9'] then
begin
R := '';
Break;
end;
C := S[I];
Inc(I);
if not(S[I] in ['0'..'9']) then
begin
R := '';
Break;
end;
N := Ord(S[I]) - Ord('0');
Inc(I);
if S[I] in ['0'..'9'] then
begin
N := N * 10 + Ord(S[I]) - Ord('0');
Inc(I);
end;
Inc(dS);
R[N] := C;
R[0] := Chr(dS);
end;
for I := 1 to dS do
if R[I] = #0 then
begin
R := '';
Break;
end;
if R = '' then
R := 'Greska u sifriranoj reci';
DecodeData := R;
end;
var
Data: String;
begin
Write('Unesi sifrovanu rec: ');
ReadLn(Data);
WriteLn('Resenje je: ', DecodeData(Data));
ReadLn;
end.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|