Sunteți pe pagina 1din 8

Algoritmi fundamentali 1

I . Structura alternativă
Algoritmi fundamentali 2

1. Să se calculeze şi să se afişeze media 6. Să se rezolve ecuaţia de gradul I pentru


aritmetică a două numere reale pozitive. coeficienţii a,b reali daţi .
citeste a,b citeste a,b
ma (a+b)/2 daca a0
scrie ma atunci x (-b/a)
stop scrie x
2. Să se interschimbe valorile a două variabile altfel daca b0
numerice . atunci scrie ‘nu exista
citeste a,b solutii’
aux a altfel scrie ‘o infini-
a b tate de solutii’
b aux sf.daca
scrie a,b sf.daca
stop stop
3. Se citeşte o cifră zecimală , să se scrie 7. Să se calculeze valoarea funcţiei
denumirea ei în litere. f(x)= x2 , daca x<0
citeste cifra 2x+1 , daca x>=0
cazuri cifra pentru un x real dat.
0 : scrie ’zero’ citeste x
1 : scrie ‘unu’ daca x<0
2 : scrie ‘doi’ atunci f x*x
3 : scrie ‘trei’ altfel f 2*x+1
4 : scrie ‘patru’ sf.daca
5 : scrie ‘cinci’ scrie f
6 : scrie ‘sase’ stop
7 : scrie ‘sapte’ 8. Să se calculeze valoarea expresiei :
8 : scrie ‘opt’ E= A+B+C , C<=-1
9 : scrie ‘noua’ C/(A+B) , -1<C<1
altfel scrie ‘eroare’ (A+B)/C , C>=1
sf.cazuri pentru A,B,C numere întregi date .
stop citeste A,B,C
4. Stabiliţi relaţia de ordine dintre două numere daca C<=-1
reale oarecare , citite de la tastatură . atunci EA+B+c
citeste a,b scrie E
daca a>b altfel daca C<1
atunci scrie ‘a>b’ atunci daca A+B0
altfel daca a=b atunci EC/(A+B)
atunci scrie ‘a=b’ scrie E
altfel scrie ‘a<b’ altfel scrie ‘Imposbil’
sf.daca sf.daca
sf.daca altfel E(A+B)/C
stop scrie E
5. Se citesc trei numere a,b,c. Să se tipărească sf.daca
maximul dintre ele . sf.daca
citeste a,b,c stop
max a 9. Se citeşte o zi , o lună şi un an calendaristic .
daca max<b Să se determine data zilei următoare.
atunci max b citeste zi,luna,an
sf.daca cazuri luna
daca max<c 1,3,5,7,8,10,12 : ultima31
atunci max c 4,6,9 : ultima30
sf.daca
scrie max 2 : daca an%4=0
stop atunci ultima29
altfel ultima28
Algoritmi fundamentali 3

sf.daca sf.daca
sf.cazuri sf.daca
daca zi<ultima sf.daca
atunci zizi+1 daca sem=1
altfel daca luna<12 atunci scrie ‘este multime’
atunci zi1 altfel scrie ‘nu este multime’
lunaluna+1 sf.daca
altfel zi1 stop.
luna1 11. Să se evalueze expresia E=A2/(A2+B)1/2 , unde
anan+1 puterea ½ înseamnă radical de ordin doi ,
sf.daca pentru A, B numere reale date .
sf.daca Ţinem cont de faptul că radicalul de ordin doi este
scrie zi,luna,an definit numai dacă expresia de sub radical este
stop pozitivă şi că nu este posibilă împărţirea la 0.
10. Se citesc patru numere oarecare . Să se citeste A,B
analizeze dacă ele alcătuiesc o mulţime în sens pA*A+B
matematic . daca p<=0
Într-o mulţime matematică elementele sunt atunci scrie ‘calcul imposibil’
distincte , nu se repetă . Vom compara cele 4 altfel EA*A/p
valori două câte două . Pentru a sesiza scrie E
nerespectarea unicităţii , vom folosi o variabilă sf.daca
iniţializată cu 1 , căreia îi vom schimba valoarea stop
când vom găsi o pereche de valori egale . 12. Să se rezolve sistemul de ecuaţii cu coeficienţi
citeste a,b,c,d reali : ax+by=c , dx+ey=f , pentru a,b,c,d,e,f
sem 1 numere reale oarecare date .
daca a=b Folosim , spre exemplu , metoda reducerii şi
atunci sem0 obţinem soluţiile:
altfel daca a=c x=(ce-bf)/(ae-bd), y=(af-cd)/(ae-bd)
atunci sem0 evident , numai dacă expresia ae-bd0 .
altfel daca a=d citeste a,b,c,d,e,f
atunci sem0 p a*e-b*d
altfel daca b=c daca p0
atunci sem0 atunci x (c*e-b*f)/p
altfel daca b=d y (a*f-c*d)/p
atunci sem0 scrie x,y
altfel daca c=d altfel scrie ‘nu exista solutii’
atunci sf.daca
sem0 stop
sf.daca
sf.daca
sf.daca
Algoritmi fundamentali 4

II. Structura repetitivă

1. Să se calculeze suma S=1+2+…..+n , scrie f


respectiv produsul P=1*2*…….*n , pentru n sf.pentru
natural nenul dat . stop
citeste n 6. Să se determine şi să se afişeze divizorii proprii
S0 ; P1 ai unui număr natural nenul dat.
pentru i=1,n Ţinem cont că divizorii proprii ai unui număr
SS+i natural n se găsesc în mulţimea {2,3, ,[n/2]} .
PP*i citeste n
sf.pentru pentru i=2,[n/2]
scrie S, P daca n%i=0
stop atunci scrie i
2. Să se calculeze media aritmetică a n valori sf.daca
reale citite pe rând de la tastatură . sf.pentru
citeste n stop
S0 7. Se defineşte şirul lui Fibonacci (legea
pentru i=1,n creşterilor organice) astfel :
citeste x F(n)= 0 , n=0
SS+x 1 , n=1
sf.pentru F(n-1)+F(n-2) , n>=2
maS/n adică termenii şirului sunt : 0 , 1, 1, 2, 3, 5, 8, 13,
scrie ma 21,…..
stop Să se afişeze termenii şirului pentru n natural
3. Să se realizeze înmulţirea a două numere nenul dat .
naturale date a şi b , prin adunări repetate . citeste n
citeste a,b a0 /* primul termen */
S0 b1 /* al doilea termen */
pentru i=1,b scrie a,’ ‘,b
SS+a /* a*b=a+a+…+a pentru i=2,n
de b ori */ ca+b / următorul termen */
sf.pentru ab
scrie S bc
stop scrie c
4. Să se calculeze câtul şi restul împărţirii a două sf.pentru
numere naturale nenule , a şi b date , prin stop
scăderi repetate. 8. Să se verifice dacă un număr natural n nenul
citeste a,b dat , este sau nu număr prim.
cat0 Facem următoarele observaţii :
cat timp a>=b - singurul număr par şi prim este 2 ; pentru n=2
aa-b nu are sens să-I verificăm divizorii proprii
catcat+1 - orice alt număr par diferit de 2 este compus
sf.cat timp fiind multiplu de 2
scrie cat , a /* a=restul */ - un număr impar nu are decăt divozori impari
stop de forma 3, 5, 7,…
5. Fie funcţia f:NN , f(x)= n+1 , n par - conform teoremei lui Euclid , dacă un număr
n-1 , n impar nu are divizori proprii în mulţimea {2,3,…√n}
Să se calculeze să să se afişeze valorile funcţiei atunci este număr prim
pentru n=1,2,…..,10. citeste n
pentru n=1,10 daca n=2
daca n%2=0 atunci scrie ‘prim’
atunci f n+1 stop
altfel f n-1 sf.daca
sf.daca daca n%2=0
Algoritmi fundamentali 5

atunci scrie ‘compus’ stop


stop 11. Se citesc pe rând n numere reale nenule . Să
sf.daca se afişeze media aritmetică a căte două
pentru i=3, [√n], 2 numere citite succesiv.
daca n%I=0 Pentru a calcula media aritmetică avem nevoie la
atunci scrie ‘compus’ fiecare pas de două valori : valoarea citită la pasul
stop anterior şi valoarea citită la pasul curent . Vom
sf.daca memora cele două valori în două variabile : x şi ,
sf.pentru respectiv y . Pentru a avea valoarea y disponibilă
scrie ‘prim’ pentru calculul următoarei medii , înainte de a
stop trece la pasul următor , vom transfera această
9. Să se descompună un număr natural nenul dat valoare în x . Prima valoare din cele n se citeşte în
în factori primi , afisând pentru fiecare factor variabila x , în afara ciclului de calcul efectiv a
prim şi puterea corespunzătoare . mediilor .
Algoritmul este cel din aritmetică . Se împarte citeste n /* cate numere */
numărul la 2 , cât timp împărţirea se face exact . citeste x /* primul numar */
Numărul împărţirilor efectuate reprezintă puterea pentru i=2,n
lui 2 . Se împarte apoi la 3 (dacă împărţirea se face citeste y /* urmatorul numar */
exact) , la 5 etc , până când , prin împărţiri ma(x+y)/2
repetate numărul devine egal cu 1. scrie ma
citeste n xy
i2 sf.pentru
repeta stop
p0 12. Se citesc pe rând n numere întregi . Să se
cat timp n%i=0 verifice dacă apar sau nu în ordine
nn/i crescătoare.
pp+1 Se observă că şirul este ordonat dacă fiecare două
sf.cat timp valori consecutive sunt ordonate , adică a k-1<=ak ,
daca p0 pentru k=2,..,n . Este suficient ca o singură
atunci scriei i, p /* i este pereche să nu respecte relaţia şi şirul nu mai este
factorul prim , p este puterea lui */ ordonat . Ca şi în problema precedentă , avem
sf.daca nevoie de valoarea citită la pasul precent şi
daca i=2 valoarea citită la pasul curent , deci vom lucra cu
atunci i3 două variabile , x şi y . Deoarece toate cele n
altfel ii+2 numere trebuiesc citite , indiferent dacă în final
sf.daca şirul este ordonat sau nu , vom folosi o variabilă
pana cand n=1 sem iniţializată cu 1 căreia îi vom da valoarea 0
stop dacă găsim o pereche neordonată . Testând la
10. Fiind dat un număr natural nenul cu maxim 8 sfârşit valoarea acestei variabile putem lua o
cifre , să se determine şi să se afişeze cifrele decizie corectă asupra naturii şirului .
sale . citeste n /* cate numere */
Ultima cifră a unui număr natural este restul sem1
împărţirii numărului la 10 . Pentru a determina citeste x /* primul numar */
următoarele cifre , trebuie să eliminăm această pentru i=2,n
ultimă cifră din număr . Numărul obţinut prin citeste y /* urmatoarul numar */
eliminarea ultimei cifre este de fapt câtul împărţirii
întregi a numărului la 10 . Repetăm procedeul daca y>x
până când numărul devine egal cu 0 , deci nu mai atunci sem0
sunt cifre nedeterminate . sf.daca
citeste n xy
repeta sf.pentru
cifra n%10 daca sem=1
scrie cifra atunci scrie ‘ordonat’
n [n/10] altfel scrie ‘neordonat’
pana cand n=0 sf.daca
Algoritmi fundamentali 6

stop citeste x /* punctul în care calculăm


13. Fiind date două numere naturale nenule , să valoarea lui P(x) */
se determine cmmdc şi cmmmc al celor două P0
numere pentru k=n, 0, -1
Pentru a determina cmmmc vom folosi relaţia citeste a /* coeficientul ak */
matematică : a*b=cmmdc(a,b)*cmmmc(a,b) . P P*x+a
Problema se reduce la determinarea cmmdc a sf.pentru
două numere naturale nenule . Unul din cei mai scrie P
cunoscuţi algoritmi pentru rezolvarea acestei stop
probleme este algoritmul lui Euclid . Pentru a b) coeficienţii se citesc în ordinea crescătoare a
înţelege modul de calcul vom considera un puterilor , adică în ordinea a0 , a1 , …………, an
exemplu : a=72 , b=60 Facem următoarele observaţii :
72%60=12 ; 60%12=0 => cmmdc=12 - dacă n=0 , atrunci P0(x)=a0
(ultimul rest nenul) - dacă n=1 , atunci P1(x)=a0+a1x=P0(x)+a1x1
a=45 , b=27 - dacă n=2 , atunci P2(x)=a0+a1x+a2x2 =P1(x)
45%27=18 ; 27%18=9 ; 18%9=0 => +a2x2
cmmdc=9 (ultimul rest nenul) - generalizând , Pk(x)=Pk-1(x)+akxk
citeste a,b Se observă că trebuie să calculăm puterile
pa*b /* a şi b îşi modifică valoarea succesive ale lui x şi să le adăugăm la valoarea
deci produsul lor polinomului
trebuie calculat înainte de a citeste n /* gradul polinomului */
aplica alg. Lui Euclid */ citeste x /* punctul în care calculăm
repeta valoarea */
resta%b P 0
ab q 1 /* corespunzător lui x0 */
brest pentru k=0 , n
pana cand rest=0 citeste a /* coeficientul ak */
cmmdc a /* ultimul rest nenul */ P P+a*q
cmmmc p/cmmdc qq*x /* calculăm xk+1 pentru
scrie cmmdc, cmmmc următorul pas */
stop sf.pentru
14. Fie P(x)=anxn+an-1xn-1+…………..+a1x+a0 . Să se scrie P
calculeze valoarea expresiei pentru x real dat , stop
n natural dat şi numerele a0 , a1,….,an reale 15. Să se treacă un număr natural nenul din baza
date . 10 în baza p dată (2<=p<=9) .
Expresia de mai sus se numeşte polinom , x fiind Algoritmul de trecere din baza 10 într-o altă bază
argumentul polinomului . Gradul maxim al lui x ( n este cel din aritmetică : se împarte numărul la p
în notaţia de mai sus ) se numeşte gradul obţinându-se un cât şi un rest ; câtul obţinut se
polinomului , iar numerele a0 , a1,….,an se numesc împarte la p şi aşa mai departe până când se
coeficienţii polinomului . obţine câtul 0 . Se scriu resturile obţinute în ordine
Există două metode pentru calculul valorii inversă , numărul rezultat fiind echivalentul în baza
polinomului în punctul x dat , după cum coeficienţii p.
polinomului se citesc în ordinea crescătoare sau Exemplu : n=47 , p=2
descrescătoare a puterilor lui x . 47:2 => cat=23 , rest=1
a) coeficienţii se citesc în ordinea descrescătoare 23:2 => cat=11 , rest=1
a puterilor lui x , adică în ordinea a n , an-1 , 11:2 => cat=5 , rest=1
…….,a0 5:2 => cat=2 , rest=1
Facem următoarele observaţii : 2:2 => cat=1 , rest=0
- dacă n=0 , atunci P0(x)=an 1:2 => cat=0 , rest=1
- dacă n=1 , atunci P1(x)=anx+an-1=P0(x)*x+an-1 numarul obtinut este : 1011112
- dacă n=2 ,atunci P2(x)=anx2+an-1xn-1+an-2 Problema care apare este afişarea numărului
=(anx+an-1)*x+an-2=P1(x)*x+an-2 obţinut pentru că resturile se obţin în ordinea
- generalizând , Pk(x)=Pk-1(x)*x+an-k , iar modul inversă a scrierii lor în număr . În plus , pentru
de calcul se numeşte “gruparea lui Horner” calculator , numărul afişat este văzut ca un număr
citeste n /* gradul polinomului */ zecimal obişnuit . Simultan cu determinarea
Algoritmi fundamentali 7

resturilor , trebuie să calculăm numărul zecimal cifra n%10


care trebuie afişat . Pentru aceasta , vom utiliza a n [n/10]
doua metodă de calcul de la polinom , deoarece b10 b10+cifra*putere
câturile reprezintă coeficienţii unui polinom pentru putere putere*p
x=10 , coeficienţi furnizaţi în ordinea crescătoare a pana cand n=0
puterilor lui 10 . (101111=1*100+1*101+1*102+ /* trecem numărul b10 în baza q */
1*103 +0*104+1*105) m 0 /* numarul in baza q */
citeste n /* numarul in baza 10 */ putere1 /* 100 */
citeste p /* baza in care trecem n */ repeta
baza 0 /* numarul in baza p */ cifra b10%q
putere1 /* 100 */ b10 [b10/q]
repeta mm+cifra*putere
cifra n%p putere putere*10
n [n/p] pana cand b10=0
bazabaza+cifra*putere scrie m
putere putere*10 stop
pana cand n=0 18. Să se treacă un număr din baza 16 în baza 10.
scrie baza Citirea numărului se face cifră cu cifră de la
stop stânga la dreapta până la citirea caracterului
16. Se citeşte un număr scris în baza p dată spaţiu.
(2<=p<=9). Să se determine echivalentul La scrierea unui număr în baza 16 se folosesc
zecimal al respectivului număr . cifrele 0..9 , literele ‘a’..’f’ sau ‘A’…’F’. Scrierea
Folosim formula de calcul a echivalentului zecimal numărului fiind practic o combinaţie de litere şi
al unui număr dat într-o bază oarecare p : cifre , vom trata numărul ca pe un şir de caractere.
(Cncn-1……c1c0)p=c0*p0+c1*p1+…….+cn*pn , unde ck Fiecare caracter citit va fi transformat în echivalent
0<=k<=n , sunt cifrele numărului scris în baza p . zecimal pe baza codurilor ASCII asociate . Citirea
Se observă că trebuie să extragem pe rând cifrele făcându-se caracter cu caracter de la stânga la
numărului şi să le înmulţim cu puterile dreapta , pentru a calcula echivalentul zecimal ,
corespunzătoare ale bazei . Practic ,se combină vom folosi prima metodă de calcul de la
algoritmul pentru determinarea cifrelor unui număr polinoame, cifrele numărului constituind coeficienţii
cu cel pentru calculul valorii unui polinom în polinomului pentru x=16 .
punctul x=p (baza) prin a doua metodă . baza 0 /* echivalentul zecimal */
citeste n /* numărul în baza p */ citeste car /* un carac. din numar */
citeste p /*baza în care este scris*/ cat timp car’ ‘ /*  de spatiu */
baza0 /* echivalentul zecimal */ cazuri car
putere1 /* p0 */ ‘0’..’9’ : bazabaza*16+
repeta cod(car)-cod(‘0’)
cifra n%10 ‘a’..’f’ : bazabaza*16+
n [n/10] cod(car)-cod(‘a’)+10
baza baza+cifra*putere ‘A’..’F’ : bazabaza*16+
putere putere*p cod(car)-cod(‘A’)+10
pana cand n=0 sf.cazuri
scrie baza citeste car
stop sf.cat timp
17. Să se treacă un număr scris în baza p dată scrie baza
(2<=p<=9) , în baza q dată (2<=q<=9 ,qp). stop
Folosim algoritmul de la problema 15 pentru a 19. Să se verifice dacă un număr natural nenul dat
calcula echivalentul zecimal al numărului dat , apoi este palindrom , adică citit de la dreapta la
algoritmul de la problema 14 pentru a trece stânga şi de la stânga la dreapta reprezintă
numărul zecimal obţinut în baza q . acelaşi număr .
citeste n /* numărul în baza p */ Pentru a verifica proprietatea , vom extrage pe
citeste p, q /* bazele de lucru */ rând cifrele numărului şi vom construi simultan
b10 0 /* echivalentul zecimal */ numărul zecimal cu cifrele în ordine inversă . Dacă
putere1 /* p0 */ obţinem aceeaşi valoare , numărul iniţial dat este
repeta palindrom .
Algoritmi fundamentali 8

citeste n Vom determina cmmdc dintre primul şi al doilea


inv 0 /* numărul invers */ număr , apoi cmmdc dintre acest cmmdc şi al
t n /* lucrăm cu copia lui n */ treilea număr etc . În final , obţinem cmmdc al
repeta celor n numere .
cifra t%10 citeste n /* câte numere */
t [t/10] citeste x /* primul număr */
inv inv*10+cifra pentru k=2, n
pana cand t=0 citeste y /* următorul număr */
daca n=inv repeta
atunci scrie ‘este palindrom’ restx%y
altfel scrie ‘nu este palindrom’ x y
sf.daca y rest
stop pana cand rest=0
20. Să se verifice dacă un număr natural nenul dat /* x=cmmdc */
este “perfect” , adică egal cu suma divizorilor sf.pentru
săi proprii , inclusiv 1 . Exemplu : 6=1+2+3 scrie x /* cmmdc */
Determinăm pe rând divizorii proprii ai numărului stop
şi-i însumăm plecând de la 1 . Dacă suma obţinută 23. Se citesc pe rând n numere . Să se determine
este egală cu numărul dat , acesta este “perfect” . minimul (maximul ) dintre ele .
citeste n Pentru a rezolva problema , vom generaliza
S 1 /* suma divizorilor */ algoritmul de determinare a maximului (minimului)
pentru k=2, [n/2] dintre 3 valori .
daca n%k=0 citeste n /* câte numere */
atunci S S+k citeste x /* primul număr */
sf.daca max x
sf.pentru pentru k=2, n
daca n=S citeste x /* următorul număr */
atunci scrie ‘este perfect” daca max<x
altfel scrie ‘nu este perfect’ atunci max x
sf.daca sf.daca
stop sf.pentru
21. Se citesc pe rând n numere reale. Să se scrie max
determine numărul valorilor pozitive , numărul stop
valoriloe negative şi , respectiv , numărul 24. Se citesc pe rând n numere reale . Să se
valorilor nule introduse . calculeze media aritmetică a valorilor strict
citeste n /* numarul valorilor */ pozitive .
poz0 /* numarul valorilor negative Vom însuma şi număra numai valorile strict
*/ pozitive citite .
neg0 /* numarul valorilor negative citeste n /* câte valori */
*/ S0 /* suma valorilor */
nul0 /* numarul valorilor nule */ Nr0 /* numărul valorilor */
pentru k=1, n pentru k=1, n
citeste x /* o valoare */ citeste x /* o valoare */
daca x>0 daca x>=0
atunci pozpoz+1 atunci SS+x
altfel daca x<0 NrNr+1
atunci negneg+1 sf.daca
altfel nulnul+1 sf.pentru
sf.daca maS/Nr
sf.daca scrie ma
sf.pentru stop
scrie poz, neg, nul
stop
22. Se citesc pe rând n numere naturale nenule .
Să se determine cmmdc al celor n numere .

S-ar putea să vă placă și