A început școala...
Algoritmi de "VACANȚĂ"Sorin GrozaBucuria cea mare a elevilor și profesorilor de pretutindeni, de când există școală pe Pământ, este vacanța... Dar, poate "școlerul" sau "profu' de info" să uite de ceea ce îl pasionează mai mult, și anume de algoritmi? Evident nu!
PedeapsaPentru că a obținut rezultate slabe la matematică în anul școlar încheiat, Prichindel a primit pe perioada vacanței următoarea pedeapsă: va trebui să scrie pe caiet toate numerele din intervalul [1,n], unde n este precizat de profesor. După ce a făcut acest lucru va trebui să spună profesorului câte cifre a scris în total și câte dintre numere au fost numere prime. Ajutați-l pe Prichindel scriind programul care rezolvă această problemă, mai ales că s-a zvonit că oferă înghețată celui care îl ajută.
Exemplu
Date de intrare n=100
Date de ieșire
Prichindel a scris in total 192 cifre Au fost intalnite 25 numere prime
Pentru a rezolva această problemă, pentru fiecare număr de la 2 la n va trebui să-i determinăm numărul de cifre și să verificăm dacă este prim. În ceea ce privește problema determinării numărului de cifre, vom folosi unele funcții și proceduri specifice limbajului Pascal, Str pentru a converti numărul în șir de caractere și apoi Length pentru a afla numărul de caractere adică numărul de cifre a numărului. Pentru a verifica dacă numărul este prim sau nu, vom împărți numărul (dacă acesta este impar) la toate numerele începând cu 3 și până la radicalul numărului analizat. Dacă un număr are divizori, cel puțin unul dintre ei se întâlnește până la radicalul numărului respectiv. Dacă nu se găsește nici un divizor, înseamnă că numărul este prim, situație în care vom incrementa un contor. Atenție!!! numărul 2 este singurul număr par care este prim și pentru numărul 1 nu se pune problema primalității.
Listing: PEDEAPSA.PAS
var nr_prime,n,i,nr:Integer; total_cifre:Longint; este:Boolean; sir:string; Begin Write('Ce numar a primit Prichindel?'); Readln(n); total_cifre:=1; for nr:=2 to n do
begin Str(nr,sir); total_cifre:=total_cifre+Length(sir); i:=3; este:=Odd(nr) or (n=2); while (i<=Sqrt(nr)) and este do
begin
if nr mod i=0 then este:=false; Inc(i,2) end; if este then Inc(nr_prime) end; Write('Prichindel a scris in total '); Writeln(',total_cifre,' cifre'); Write('Au fost intalnite '); Writeln(nr_prime,' numere prime') End.
ExcursiaLa sfârșit de săptămână o clasă de elevi, împreună cu profesorul lor de informatică, au plecat într-o excursie la munte. După ce au sosit la cabană și s-a instalat fiecare, profesorul a anunțat adunarea în fața cabanei și alinierea pe un rând, în vederea stabilirii sarcinilor. Profesorul (cu gândul mereu la informatică) observă că elevii s-au așezat într-un mod foarte interesant: așezarea lor are aspect de "munte", adică toți copiii până la cel de pe o poziție k (numit vârful muntelui) au înălțimile în ordine strict crescătoare, iar în continuare, până la sfârșit, în ordine strict descrescătoare. Profesorul cere celui mai bun informatician din clasă să scrie un program care verifică dacă așezarea copiilor are sau nu aspect de "munte". În caz afirmativ programul va afișa mesajul "Asezare cu aspect de munte cu varful la" urmat de poziția copilului ce reprezintă "vârful muntelui", în caz contrar se va afișa mesajul "Asezare oarecare".
Exemplu
Date de intrare 6 - numărul copiilor 9 14 36 71 10 4 - înălțimile copiilor
Date de ieșire
Asezare cu aspect de munte cu varful la 4
Date de intrare 7 15 47 21 13 26 82 45
Date de ieșire
Asezare oarecare
Este clar că dacă așezarea are aspect de munte, vârful este elevul cu înălțime maximă din șir. Vom afla maximul și poziția lui în șirul de elevi. Dacă poziția maximului este prima sau ultima, atunci așezarea nu are aspect de munte. Se verifică în continuare cele două părți, prima de la început și până la poziția maximului și a doua de la poziția maximului și până la sfârșit. Dacă prima parte nu este crescătoare sau cea de-a doua nu este descrescătoare, atunci așezarea este oarecare. În caz contrar așezarea are aspect de munte cu vârful la poziția maximului.
Listing: ASEZARE.PAS
var i,a,j,max,n,sir:Integer; x:array[1..100] of Integer; bun:Boolean; begin Write('introduceti numarul de elevi '); Readln(n); Writeln('Dati inaltimile elevilor '); for i:=1 to n do read(x[i]); max:=x[1]; a:=1; for i:=1 to n do if x[i]>max then begin max:=x[i]; a:=i end; if (a=1) or (a=n) then Writeln('Asezare oarecare')
else
begin i:=1; bun:=true; while (i<=a-1) and (bun) do
begin if x[i]>x[i+1] then bun:=false; Inc(i) end; j:=a; while (j<=n-1) and (bun) do
begin if x[j]<x[j+1] then bun:=false; Inc(j) end; if bun then Writeln('Asezare cu aspect de munte' +'cu varful la ',a) else Writeln('Asezare oarecare') end End.
Alegerea cabinelorIată-ne plecați și în excursie la Geoagiu Băi la o scaldă binemeritată pe această căldură sufocantă. Pe drum, viitorii noștri informaticieni și-au pus întrebarea dacă își pot alege cabine cu numere consecutive dar care să nu fie numere prime. Ei știu că sunt n elevi plecați în excursie și că la Geoagiu sunt m cabine. Scrieți un program care, în caz afirmativ, va afișa toate posibilitățile de alegere a cabinelor conform restricțiilor. O posibilitate va fi indicată prin numerele de ordine ale primei și ultimei cabine. Dacă nu se poate găsi o astfel de posibilitate, se va afișa mesajul Alegere imposibila.
Exemplu
Date de intrare n = 5 m = 50
Date de ieșire
24 - 28 32 - 36
Deoarece aveau timp suficient la dispozitie, elevii au luat "la rost" fiecare secvență de n numere naturale consecutive. S-a verificat fiecare număr dacă este prim și, în cazul în care s-a întâlnit unul, secvența a fost abandonată. În cazul în care toate numerele din secvență nu sunt prime s-a găsit o posibilitate. Aceasta se va afișa, iar variabila solutie va deveni true pentru a semnala că există soluție. Evident că această soluție nu este una optimă, deoarece se repetă unele calcule. Vă propunem să căutați și alți algoritmi, mai eficienți (eventual folosind șirul sumelor parțiale, discutat în numerele anterioare).
Listing: ALEGERE.PAS
var n,m,k,i,j,d,p:Integer; este,solutie:Boolean; Begin Write('Cati elevi sunt in excursie... '); Readln(n); Write('Cate cabine sunt la Geoagiu... '); Readln(m); for i:=2 to m-n+1 do begin p:=0; j:=i; while (j<=i+n-1) and (p=0) do
begin d:=2; este:=true; while (d<=sqrt(j)) and (este) do begin if j mod d=0 then este:=false; Inc(d) end; if este then Inc(p); Inc(j) end; if p=0 then
begin
Writeln(i,' - ',i+n-1); solutie:=true end end; if not solutie then Writeln('Alegere imposibila') End.
La taifasEra odată o țară fără griji în care oamenii nu făceau nimic și discutau toată ziua. Ei se așezau într-un șir ce avea la început înțeleptul urmat în continuare de ceilalți, în ordinea descrescătoare a inteligenței lor. Autoritățile, vrând să evite orice situație neplăcută, au hotărât să-i separe, punând oameni de ordine după fiecare grup format din p persoane. Plasarea oamenilor de ordine începe de la cel mai din dreapta și fiecare nou grup de oameni de ordine amplasat are cu unul mai multe persoane decât celălalt, primul fiind format dintr-o singură persoană. Scrieți un program care citește șirul care conține inițialele persoanelor și valoarea p, apoi afișează: - configurația șirului după amplasarea oamenilor de ordine; - un mesaj din care să rezulte dacă înțeleptul va fi izolat sau nu, adică va mai avea sau nu un vecin cu care să discute.
Exemplu
Date de intrare abcdbdahb, p=2 abcde, p=3
Date de ieșire a****bc***db**da*hb ab*cde izolat neizolat
Observație: Prin * s-a simbolizat un om de ordine.
În tabără
În tabăra Pescăruș (foarte solicitată) au sosit mulți copii. Directorul taberei are o problemă pentru că nu știe câți copii au sosit în tabără. Dar el observă următorul lucru: dacă ar face grupuri de câte n copii ar rămâne p copii (p<n), iar dacă ar face grupuri de câte m copii ar rămâne q copii (q<m). Care este numărul copiilor sosiți în tabără, știind că el este cel mai mic număr care verifică aceste proprietăți. În caz că acest număr nu există se va afișa mesajul Eroare!!!
Exemplu
Date de intrare n=5,p=2 m=7,q=4
Date de ieșire
numarul de copii = 32
Date de intrare n=3, p=1 m=3, q=2
Date de ieșire Eroare!!!
CompetițiaSe consideră două clase de elevi, fiecare având n elevi. Elevii din fiecare clasă sunt numerotați cu numere de la 1 la n, neexistând doi elevi cu același număr. Elevii fiecărei clase se așează la întâmplare în șir. Pentru fiecare clasă se va calcula un punctaj astfel: pentru fiecare elev se numără câți de la început până la el au numere mai mari decât el. Se va face suma acestor valori calculate pentru fiecare elev. Suma finală va fi punctajul clasei. Să se calculeze punctajul fiecărei clase și să se afișeze clasa cu punctaj mai mare.
Exemplu
Date de intrare n=6 2,3,1,6,5,4 - clasa I 4,6,1,3,2,5 - clasa II
Date de ieșire Punctaj clasa I: 5 Punctaj Clasa II: 8 Castiga clasa II
Să jucăm rummyUn copil are pe o tablă de rummy mai multe piese ce alcătuiesc un număr. Prin scoaterea unei piese se formează două numere noi. În timp ce aștepta mutarea partenerului, și-a pus următoarea problemă: a câta piesă trebuie eliminată astfel încât suma celor două numere obținute să fie maximă. Scrieți un program care, plecând de la numărul de pe tablă, afișează a câta piesă se elimină; de asemenea este afișată suma maximă obținută în această situație.
Exemplu
Date de intrare n = 2735
Date de ieșire a 2-a piesă - suma 37
Domnul Sorin Groza este profesor la Clubul Copiilor din Aiud și poate fi contactat prin intermediul redacției. [cuprins] |