www.agora.ro
A început școala...

Algoritmi de "VACANȚĂ"

Sorin Groza

Bucuria 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!

Pedeapsa

Pentru 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.

Excursia

La 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 cabinelor

Iată-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 taifas

Era 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ția

Se 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 rummy

Un 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]