12.07.2022 Views

Culegere de ALGORITMI elementari la INFORMATICA

Culegere de ALGORITMI elementari la INFORMATICA

Culegere de ALGORITMI elementari la INFORMATICA

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Coșniță Emilia-Felicia

Culegere de

algoritmi

elementari la

disciplina

informatică

Iași

2022



Coșniță Emilia-Felicia

Culegere de algoritmi

elementari

la disciplina informatică

Iași

2022


Descrierea CIP a Bibliotecii Naționale a României

COȘNIȚĂ, EMILIA-FELICIA

Culegere de algoritmi elementari la disciplina informatică

Iași, 2022

ISBN 978-973-0-36613-6


Prefață

Actualele abordări mondiale în domeniu accelerate de progresul rapid al noilor

tehnologii, cum ar fi inteligența artificială, robotica, tehnologiile de tip cloud computing și

blockchain, aduc cu sine noi provocări și pentru elevii, studenții și cadrele didactice din

România.

Expunerea zilnică la date digitale, în mare parte, create de algoritmi de

nepătruns pentru tinerii nativi digitali, solicită acestora o gândire logică, analitică. O

nouă abilitate devine astfel absolut necesară în soluționarea problemelor din viața

reală, această abilitate se numește "gândire computațională" (computational thinking).

Pentru cineva novice în domeniu care trebuie să îmbrățișeze capacitatea de a

gândi algoritmic (algorithmically), termeni de descompunere (decomposition),

generalizare (generalization), abstractizare (abstractions) și evaluare (evaluation) pot fi

înfricoșători.

Concepută ca un instrument operaţional - suport pentru activităţile de instruire şi

autoinstruire, lucrarea Culegere de algoritmi elementari la disciplina informatică

propune un evantai larg de aplicații şi demersuri teoretice, însoţite de implementări în

C++ fundamentate pe dimensiunea teoretică.

Lucrarea se adresează în primul rând elevilor, dar poate în același timp să

constituie un instrument de lucru și pentru studenţii care urmează modulul de pregătire

psihopedagogică, pentru profesorii debutanți și subliniază importanța algoritmului în

programare, care trebuie înțeles cu atenție, mai ales că gândirea computațională nu se

rezumă doar la găsirea în mod mecanic (prin calcul) a unor rezultate, ci formează

mecanismul de gândire prin care cititorul descoperă cea mai eficientă variantă a codului

în condițiile datelor de intrare, a constrângerilor, dar și a ierarhizării priorităților.

Așadar, sinteză a preocupărilor de debut în implementările de codare, culegerea

reunește algoritmii scriși alfabetic , constituind etapa de pornire pentru programe din

ce în ce mai mari şi mai complicate.

Publicația Culegere de algoritmi elementari la disciplina informatică se

dovedește a fi un mijloc inspirat pentru transmiterea unor informații și transformarea

acestora în abilități, pentru optimizarea competențelor profesionale, mijloc ce conduce

la creșterea randamentului școlar. În același timp, culegerea se poate identifica și ca

“unealtă” în procesul sistematic de predare pentru profesorii de informatică.

Prof. Pădurariu Emanuela Tatiana

Inspector școlar pentru informatică



Cuprins

Algoritmul lui EUCLID ................................................... Eroare! Marcaj în document nedefinit.

Algoritmul de INTERSCHIMBARE ............................................................................................. 10

CĂUTARE BINARĂ .................................................................................................................... 11

CĂUTARE SECVENȚIALĂ ........................................................................................................ 12

CIFRA de CONTROL ................................................................................................................... 14

CIURUL lui ERATOSTENE ........................................................................................................ 15

CONJECTURA lui GOLDBACH ................................................................................................. 15

CONJECTURA complementarului NUMĂRULUI PAR ............................................................. 18

DESCOMPUNERE în FACTORI PRIMI ..................................................................................... 21

DETERMINAREA MINIMului unui șir ....................................................................................... 23

DETERMINAREA MAXIMului unui șir .................................................................................... 23

DETERMINAREA DIVIZORILOR proprii ai unui NUMĂR ..................................................... 24

FUNCȚIA lui EULER .................................................................................................................. 25

INTERCLASARE ......................................................................................................................... 26

NUMĂR APROAPE PRIM .......................................................................................................... 28

NUMĂR CIURUIT ....................................................................................................................... 29

NUMĂR CORECT ........................................................................................................................ 30

NUMĂR DUBLIC ........................................................................................................................ 31

NUMĂR ECHILIBRAT ................................................................................................................ 32

NUMĂR FERICIT ........................................................................................................................ 33

NUMĂR GENEROS ..................................................................................................................... 34

NUMĂR GREU ÎNCERCAT........................................................................................................ 35

NUMĂR IMPERFECT ................................................................................................................. 36

NUMĂR LEGAT .......................................................................................................................... 37

NUMĂR MUNTE ......................................................................................................................... 38

NUMĂR NEVRICOS ................................................................................................................... 39

NUMĂR NOROCOS .................................................................................................................... 40

NUMĂR OPTIM ........................................................................................................................... 41

NUMĂR PALINDROM ................................................................................................................ 42

NUMĂR PĂTRAT PERFECT ...................................................................................................... 43

NUMĂR PERFECT ...................................................................................................................... 44


Cuprins

NUMĂR PITIC ............................................................................................................................. 44

NUMĂR PRIM .............................................................................................................................. 45

NUMĂR PUTERNIC .................................................................................................................... 46

NUMĂR ROTUND ....................................................................................................................... 48

NUMĂR SEMIPALIDROM ......................................................................................................... 49

NUMĂR SUBȚIRE ....................................................................................................................... 50

NUMĂR SUPERPALINDROM ................................................................................................... 51

NUMĂR SUPERPERFECT .......................................................................................................... 52

NUMĂR SUPERPRIM ................................................................................................................. 53

NUMĂR VALE ............................................................................................................................. 54

NUMERE în ECHER .................................................................................................................... 56

NUMERE PITAGOREICE ........................................................................................................... 56

NUMERE PRIETENE .................................................................................................................. 57

OGLINDITUL unui număr............................................................................................................ 58

METODA BULELOR ................................................................................................................... 58

SORTARE prin INSERTIE ........................................................................................................... 60

SORTARE prin NUMĂRARE ...................................................................................................... 61

SORTARE prin SELECTIE .......................................................................................................... 63

REZOLVARE ecuație de GRAD I ................................................................................................ 64

REZOLVARE ecuatie de GRAD II .............................................................................................. 64

SIMPLIFICAREA unei FRACTII ................................................................................................. 65

SIRUL lui FIBONACCI ................................................................................................................ 67

SISTEM de 2 ecuatii liniare cu 2 NECUNOSCUTE .................................................................... 68

SISTEM de 3 ecuatii liniare cu 3 NECUNOSCUTE .................................................................... 69

SEPARAREA CIFRELOR UNUI NUMĂR ................................................................................. 70

SUMĂ ARMONICĂ ..................................................................................................................... 71

TRANSFORMARE A UNUI NUMĂR DIN BAZA 10 IN BAZA B........................................... 71

TRANSFORMARE A UNUI NUMĂR DIN BAZA B IN BAZA 10........................................... 72

VERIFICARE laturi TRIUNGHI .................................................................................................. 73


Coșniță Emilia - Felicia

Algoritmul lui EUCLID

Algoritmul lui Euclid este o metodă eficientă de calcul al celui mai mare divizor

comun, metodă simplu de implementat într-un program. Algoritmul are două variante:

A. Prin scăderi repetate

Pseudocod

citește a, b (numere naturale nenule)

cât timp b != a execută

| dacă a > b atunci a ← a - b;

| | altfel b ← b - a;

| └■ sf dacă

└■sf Cât timp

SCRIE a

Implementare C++

#include <iostream>

using namespace std;

int a, b;

int main()

{

cin >> a >> b;

while(b != a){

if(a > b) a = a - b;

else b = b -a;

}

cout << a;

return 0;

}

B. Prin împărțiri repetate

Pseudocod

citește a,b

cât timp b != 0 execută

| r ← a%b;

| a ← b;

| b ← a;

└■sf Cât timp

SCRIE a

Implementare C++

#include <iostream>

using namespace std;

int a, b, r;

int main()

{

cin >> a >> b;

while(b != 0)

{

r = a % b;

a = b;

b = r;

}

cout << a << endl;

return 0;

}

9 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Algoritmul de INTERSCHIMBARE

În diverse probleme este necesară comutarea simultană a valorilor a două

variabile. Se mai numește metoda paharelor, explicarea procedeului făcându-se

exemplificând interschimbarea conținutului a două pahare. Pornind de la variabila a ce

conține un număr a și variabila b conține un număr b.

Problemă

Se citesc de la consolă două numere întregi a și b. Să se interschimbe valorile celor

două numere.

Pseudocod

Pentru a interschimba conținutul a două variabile a și b putem folosi 3 metode:

A. Folosind o variabilă auxiliară, pe care o vom nota cu aux:

citește a, b

aux ← a

a ← b

b ← aux

SCRIE a, b

Implementare C++

#include <iostream>

using namespace std;

int a,b,aux;

int main ( )

{

cin>>a>>b;

aux=a;

a=b;

b=aux;

cout<<a<< " " <<b;

return 0;

}

B. Folosind adunarea si scaderea:

citește a, b

a ← a+b

b ← a-b

a ← a-b

SCRIE a, b

Implementare C++

#include <iostream>

using namespace std;

int a,b;

int main ( )

{ cout<<“Citește val in var a”;

cin>>a;

cout<<“Citește val in var b”;

cin>>b;

a=a+b;

b=a-b;

a=a-b;

cout<<“afiseaza val din variabila a”<<a<<endl;

cout<<“afiseaza val din variabila b”<<b;

return 0;

}

10 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

C. Folosind înmulțirea și împărțirea:

citește a, b

a ← a*b

b ← a/b

a ← a/b

SCRIE a, b

Implementare C++

#include <iostream>

using namespace std;

int a,b;

int main ()

{

cin>>a>>b;

a=a*b;

b=a/b;

a=a/b;

cout<<a<<" "<<b;

return 0;

}

CĂUTARE BINARĂ

Algoritmul de căutare binară este un algoritm de căutare folosit pentru a găsi un

element într-o listă ordonată (implementat cu un tablou unidimensional/vector).

Căutarea binară este o metodă de căutare eficientă care se aplică doar

vectorilor ordonați.

Dacă vrem să căutăm în vectorul v, ordonat crescător, de lungime n, indexat de la

0, un element x, căutarea binară presupune:

• să calculăm poziția din mijloc

• să verifică dacă elementul căutat este egal cu elementul de pe poziția din mijloc

- dacă da, algoritmul s-a încheiat

- dacă nu, verificăm cum este elementul căutat față de elementul de pe poziția din

mijloc.

- Dacă este mai mic, căutarea se va continua în partea stângă (se modifică limita

superioară), iar dacă este mai mare, vom continua la dreapta elementului de pe

poziția din mijloc (se modifică limita inferioară).

• Algoritmul se va repeta de la primul pas

• căutarea se va încheia fie când am găsit elementul, fie când limitele se depășesc

(nu l-am găsit)

Problemă

Se citește un șir ordonat crescător cu n numere întregi, indexat de la 0. Să se

verifice dacă în acest șir se găsește un număr x.

Pseudocod

citește n, x

poz ← -1

11 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

pentru i=0,n-1,1 execută

| citește v[i]

└■sf pentru

m ← n/2

cât timp poz != m execută

| Dacă x = v[m] atunci poz ← m

| └■sf dacă

| Dacă x < v[m] atunci m ← m/2

| └■sf dacă

| Dacă x > v[m] atunci m ← (n+m)/2

| └■sf dacă

└■sf Cât timp

dacă poz != -1 atunci

| SCRIE elementul se afla pe pozitia:(poz+1)

| altfel

| SCRIE elementul nu se afla in sir

└■sf dacă

Implementare C++

#include<iostream>

using namespace std;

int n,x,v[10],m,i, poz = -1;

int main()

{

cout<<"dati numarul de elemente: ";

cin>>n;

cout << "dati numarul cautat ";

cin >> x;

cout<<"introduceti elementele in ordine crescatoare " << endl;

for (i=0;i<n;i++) cin>>v[i];

m = n/2;

while(poz != m)

{

if (x==v[m]) poz = m;

if (x < v[m]) m = m/2;

if (x > v[m]) m =(n+m)/2;

}

if(poz != -1)

cout<<"elementul "<<x<<" a fost gasit pe pozitia:

"<<poz+1;

else

cout << "elementul nu exista";

return 0;

}

CĂUTARE SECVENȚIALĂ

Algoritmul de căutare secvențială este un algoritm de căutare folosit pentru a

găsi un element într-o listă aleatoare (implementat cu un tablou

unidimensional/vector).

Dacă vrem să căutăm în vectorul v, indexat de la 0, de lungime n, un element x,

căutarea secvențială presupune:

12 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

- să parcurgem vectorul, pornind de la primul element

- să testăm element cu element, dacă elemenul căutat se află în șir,

- căutarea se va încheia fie când am găsit elementul, fie când am verificat toate

elementele vectorului și nu l-am găsit

Din păcate, algoritmul nu este eficient.

Problemă

Se citește un șir cu n numere întregi, ce nu sunt ordonate. Să se verifice dacă în

acest șir se găsește un număr x.

Pseudocod

citește n, x (numere naturale nenule)

pentru i=0,n-1,1 execută

| citește v[i]

└■sf pentru

i ← 0

gasit ← 0

cât timp i<n și gasit=0 execută

| dacă x = v[i] atunci gasit ← 1

| └■sf dacă

| i ← i+1

└■sf pentru

dacă gasit = 1 atunci

| SCRIE este în sir

| altfel

| SCRIE Nu l-am gasit

└■sf dacă

Implementare C++

#include<iostream>

using namespace std;

int n,x,v[10],m,i, gasit=0;

int main()

{

cout<<"dati numarul de elemente: ";

cin>>n;

cout << "dati numarul cautat ";

cin >> x;

cout<<"introduceti elementele aleatoare " << endl;

for (i=0;i<n;i++) cin>>v[i];

i=0;

while(i<n && gasit==0)

{

if (x==v[i]) gasit=1;

i++;

}

if(gasit)

cout<<"elementul "<<x<<" a fost gasit pe pozitia: "<<i-

1;

else cout << "elementul nu exista";

return 0;

}

13 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

CIFRA de CONTROL

Cifra de control a unui număr întreg pozitiv se obține prin însumarea iterativă

cifrelor sale, apoi a cifrelor sumei sale, până se ajunge, în cele din urmă, la un număr de

o singură cifră.

Exemple: n=628317101 S=6+2+8+3+1+7+1+0+1=29, S=2+9=11, S=1+1=2.

Numerologii folosesc acest procedeu pentru a calcula numărul destinului făcând

suma cifrelor care formează data de naştere, până când rămâne o singură cifră.

Problemă

Se citește de la consolă un număr natural n cu mai multe cifre (n<2 000 000 000).

Să se determine cifra de control a acestui număr.

Pseudocod

citește n (număr natural nenul)

Repetă

| S ← 0

| cât timp(n!=0) execută

| | S ← S+(n%10)

| | n ← n/10

| └■sf Cât timp

| n ← S

└■Până cand S<10

Implementare C++

#include <iostream>

using namespace std;

int n,S;

int main()

{

cout<<"dati numarul ";

cin>>n;

do

{

S=0;

while(n!=0)

{

S=S+(n%10);

n=n/10;

}

n=S;

}while(S>9);

cout<<“cifra de control este “<<S;

return 0;

}

14 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

CIURUL lui ERATOSTENE

Ciurul lui Eratostene reprezintă o metodă de determinare a tuturor numerelor

prime mai mici sau egale cu o valoare dată, n. În practică, valoarea lui n trebuie să fie

una rezonabilă, ea depinzând de restricțiile de timp și memorie aplicate problemei.

sursa: www.pbinfo.ro

Pseudocod

e[0] ← 1

e[1] ← 1

Citește n (număr natural nenul)

pentru i ← 2,sqrt(n) execută

| dacă e[i] = 0 atunci

| | pentru j ← 2, [n/i] execută

| | | e[i*j] ← 1

| | └■ sf_pentru

| └■ sf_dacă

└■sf_pentru

Implementare C++

#include <iostream>

using namespace std;

bool e[1000000];

int main()

{

int i,j;

e[0]=1;

e[1]=1;

for(i=2; i*i<=1000000; i++)

{

if(e[i]==0)

{

for(j=2; j<=1000000/i; j++)

{

e[i*j]=1;

}

}

}

return 0;

}

CONJECTURA lui GOLDBACH

Conjectura lui Goldbach este o presupunere din partea matematicianului german

Christian Goldbach, formulată astfel:

Orice întreg mai mare decât 2 poate fi scris ca sumă de 2 numere prime.

La vremea aceea, 1 era considerat număr prim. El a observat că în toate cazurile pe

care le-a încercat, orice număr par (cu excepția lui 2, care este el însuși un număr prim)

poate fi reprezentat ca suma a două numere prime.

15 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

De exemplu, 4=2+2, 6=3+3, 8=5+3, 10=5+5=3+7, 12=5+7, 14=7+7=3+11,

16=13+3=11+5, ... , 100=97+3 etc.

sursa: www.wikipedia.org

Problemă

Se citește de la consolă un număr natural n (n>2). Să se afișeze acest număr ca

sumă de două numere prime.

Pseudocod

citește n

dacă n >=4 si n%2 = 0 atunci

| x ← 2

| cât timp ( x<= n/2 ) execută

| | primx ← 1

| | dacă x =2 sau x=3 atunci primx ← 1

| | | altfel

| | | dacă x%2 = 0 atunci primx ← 0

| | | | altfel d← 3

| | | | Cât timp (d*d<= x și x % d!=0) execută

| | | | | d← d+2

| | | | └■sf. cât timp

| | | | dacă x % d = 0 atunci primx ← 0

| | | | └■sf. dacă

| | | └■sf. dacă

| | └■sf. dacă

| | y ← n - x

| | primy ← 1

| | dacă y =2 sau y=3 atunci primy ← 1

| | | altfel

| | | dacă y%2 = 0 atunci primy ← 0

| | | | altfel d← 3

| | | | cât timp (d*d<= y și y % d!=0) execută

| | | | | d ← d+2

| | | | └■sf. Cât timp

| | | | dacă y % d = 0 atunci primy ← 0

| | | | └■sf. dacă

| | | └■sf. dacă

| | └■sf. dacă

| | dacă primx=1 si primy=1 atunci SCRIE x,‘ ‘, y

| | x ← x + 1

| └■sf. cât timp

| altfel

| SCRIE “ nu se poate aplica conjectura lui Goldbach”

└■sf. dacă

sfarsit

Implementare C++

#include <iostream>

using namespace std;

int main()

{

int n,x=2,primx,primy,d,y;

cin>>n;

if(n>=4 && n%2==0)

{

16 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

while( x<=n/2)

{

primx=1;

if(x==2 || x==3) primx=1;

else

{

if (x%2==0) primx=0;

else

{

d=3;

while(d*d<=x && x%d!=0) d=d+2;

if( x%d==0) primx=0;

}

}

y=n-x;

primy=1;

if(y==2 || y==3) primy=1;

else

{

if (y%2==0) primy=0;

else

{

d=3;

while(d*d<=y && y%d!=0) d=d+2;

if( y%d==0) primy=0;

}

}

if(primx==1 && primy==1) cout<<x<<" "<<y<<" ";

x=x+1;

}

}

else cout<<" nu se poate aplica conjectura lui Golbach ";

return 0;

}

Conjectura lui Goldbach – implementare cu subprograme

#include <iostream>

using namespace std;

int prim(int n)

{

int d=2,ok=1;

if(n==2 || n==3) ok=1;

else

if(n%2==0) ok=0;

else

{

for(d=3;d*d<=n;d++)

if(n%d==0)

{ok=0;

break;

}

}

return ok;

}

17 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

int main()

{

int n,i;

cout<<"dati numarul ";

cin>>n;

for(i=2;i<=n/2;i++)

if(prim(i)==prim(n-i)&& prim(i))

cout<<i<<" + "<<n-i <<" = "<<n<<endl;

return 0;

}

CONJECTURA complementarului NUMĂRULUI PAR

Fie n un numar arbitrar - dacă pentru fiecare număr par mai mic egal cu n si mai

mare egal cu 8 se găsesc primele 3 numere prime care nu se găsesc în descompunerea

acestuia, în aproximativ ¼ din cazuri cel putin unul dintre cele 3 numere formate din

diferența numărului inițial cu primele care nu intră în descompunerea lui este număr

prim.

Nota: n trebuie să fie foarte mare (raportul tinde la ¼ odată cu creșterea la infinit

a lui n).

Pseudocod

subprogram prim(x)

d←2

k←1

cât timp(x>1)

| p←0

| cât timp(x%d==0)

| | x ← x/d

| | p ← p+1

| └■sf. cât timp

| dacă(p>0) atunci k←k*(p+1)

| └■sf. dacă

| d ← d+1

| dacă(x>1 Si d*d>x) atunci d←x

| └■sf. dacă

└■sf. cât timp

Dacă(k=2) atunci Returneaza 1

| altfel Returneaza 0

└■sf. dacă

sf. subprogram

început

mx←1000000

k←1

e[0]←1

e[1]←1

pentru i←2,mx execută

| dacă(e[i]=0) atunci

| | prim[k]←i

| | k←k+1

| | pentru j←2,mx/i execută

18 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

| | | e[i*j]=1

| | └■sf. pentru

| └■sf. dacă

└■sf. pentru

citește n

cnt←0

pentru i←8,n,2 execută

| x←i

| d←1

| y←0

| cât timp(x>1)

| | p←0

| | Cât timp(x%prim[d]==0)

| | | x ← x/prim[d]

| | | p ← p+1

| | └■sf. Cât timp

| | dacă (p=0) atunci

| | | dacă (y=0) atunci a←prim[d], y←y+1

| | | └■sf. dacă

| | | dacă (y=1) atunci b←prim[d], y←y+1

| | | └■sf. dacă

| | | dacă (y=2) atunci c←prim[d], y←y+1

| | | └■sf. dacă

| | └■sf. dacă

| | d ← d+1

| └■sf. Cât timp

| dacă (y=0) atunci a←prim[d], y←y+1

| └■sf. dacă

| dacă (y=1) atunci d←d+1,b←prim[d], y←y+1

| └■sf. dacă

| dacă (y=2) atunci d←d+1,c←prim[d], y←y+1

| └■sf. dacă

| dacă(prim(x-a)=1 SAU prim(x-b)=1 SAU prim(x-c)=1) atunci

| | cnt ←cnt+1

| └■sf. dacă

└■sf. pentru

SCRIE cnt/n

sfârșit

Implementare C++

//Programul calculează raportul amintit în conjectura

#include <iostream>

#include <iomanip>

using namespace std;

bool e[7000000];

unsigned long long prim[7000000];

bool primal(int x)

{

int d=2,k=1,p;

while(x>1)

{

p=0;

19 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

}

while(x%d==0)

{

x/=d;

p++;

}

if(p) k*=(p+1);

d++;

if(d*d>x && x>1) d=x;

}

return k==2;

void descompunere(int x, int &f1, int &f2, int &f3)

{

// se gasesc primele 3 numere prime care nu se afla in

descompunerea in factori primi a numarului

int d=1,p,cnt=0;

while(x>1)

{

p=0;

while(x%prim[d]==0)

{

x/=prim[d];

p++;

}

if(p==0)

{

if(cnt==0)

{

f1=prim[d];

cnt++;

}

else if(cnt==1)

{

f2=prim[d];

cnt++;

}

else if(cnt==2)

{

f3=prim[d];

cnt++;

}

}

d++;

}

if(cnt==0)

{

f1=prim[d];

cnt++;

}

if(cnt==1)

{

d++;

f2=prim[d];

cnt++;

}

20 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

}

if(cnt==2)

{

d++;

f3=prim[d];

cnt++;

}

int main()

{

int i,j,k=0;

// Se construieste Ciurul lui Eratostene

for(i=2; i<=7000000; i++)

{

if(!e[i])

{

prim[++k]=i;

for(j=2; j<=7000000/i; j++) e[i*j]=1;

}

}

int n;

k=0;

cin >> n;

// verificam cate dintre numerele mai mici egale cu n nu

respecta conjunctura

for(i=8; i<=n; i+=2)

{

int a,b,x=i,c;

descompunere(i,a,b,c);

if(primal(x-a) || primal(x-b) || primal(x-c))

{

k++;

}

}

//cu cât n este mai mare, cu atat raportul dintre k si n tinde

la 1/4

cout << fixed << setprecision(3) << (double)k/n;

return 0;

}

DESCOMPUNERE în FACTORI PRIMI

Descompunerea în factori primi a unui număr compus n este procesul prin care

se găsesc divizorii primi prin a căror înmulțire se obține numărul n. (Un număr

compus este un număr întreg pozitiv care are cel puțin un divizor pozitiv în afară de 1

și el însuși. )

Orice număr natural n mai mare decât 1 se poate SCRIE în mod unic sub forma

unde

Exemple: n = 5544

21 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Problemă

Se citește de la consolă un număr natural n (n>2). Să se afișeze descompunerea în

factori primi a acestui număr.

Pseudocod

citește n (număr natural nenul)

d ← 2

cât timp (n%d=0) execută

| n←n/d;

| p←p+1;

└■sf. cât timp

dacă(p>0) SCRIE d ’^ ’ p ’*’

└■ sf. dacă

d ← 3

cât timp (n!=1) execută

| p←0;

| cât timp (n%d=0) execută

| | n←n/d;

| | p←p+1;

| └■sf. Cât timp

| dacă(p!=0) SCRIE d ’^ ’ p ’ * ’

| └■

| d←d+2

└■sf. cât timp

Implementare C++

#include <iostream>

using namespace std;

int main()

{

int n,d,p=0;

cin>>n;

d=2;

while(n%d==0)

{

n=n/d;

p++;

}

if(p>0) cout<<d<<" "<<p<<" * ";

d=3;

while(n>1)

{

p=0;

while(n%d==0)

{

n=n/d;

p++;

}

if(p>0) cout<<d<<" "<<p<<" * ";

d=d+2;

}

return 0;

}

22 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

DETERMINAREA MINIMului unui șir

Algoritmul prin care aflăm minimul elementelor unui șir de numere are pașii:

- presupunem că primul element din șir este cel mai mic,

- comparăm acest element cu celelalte n-1 elemente de după el,

- dacă găsim un element mai mic decât cel presupus, acesta devine noul minim al

șirului.

Problemă

Se citește de la consolă un șir cu n numere întregi (n>2). Să se determine și să se

afișeze cel mai mic număr din acest șir.

Pseudocod

citește n, x // x e primul numar din sir

min ← x

pentru i = 2,n,1 execută

| citește x

| dacă (x < min) atunci min ← x

| └■ sf. dacă

└■ sf. pentru

SCRIE min

Implementare C++

#include <iostream>

using namespace std;

int n,minim,i,nr;

int main ()

{

cin >> n >> minim;

for (i=2 ; i<=n ; i++)

{

cin >> nr;

if ( nr < minim) minim = nr;

}

cout << "Minimul sirului este " << minim;

return 0;

}

DETERMINAREA MAXIMului unui șir

Algoritmul prin care aflăm maximul elementelor unui șir de numere are pașii:

- presupunem că primul element din șir este cel mai mare,

- comparăm acest element cu celelalte n-1 elemente de după el,

- dacă găsim un element mai mare decât cel presupus, acesta devine noul maxim

al șirului.

Problemă

Se citește de la consolă un șir cu n numere întregi (n>2). Să se determine și să se

afișeze cel mai mare număr din acest șir.

Pseudocod

citește n, x // x e primul numar din sir

max ← x

23 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

pentru i = 2,n,1 execută

| citește x

| dacă (x>max) atunci max ← x

| └■ sf. dacă

└■ sf. pentru

SCRIE max

Implementare C++

#include <iostream>

using namespace std;

int n,maxim,i,nr;

int main ()

{

cin >> n >> maxim;

for (i=2 ; i<=n ; i++)

{

cin >> nr;

if (nr > maxim) maxim = nr;

}

cout << "maximul sirului este " << maxim;

return 0;

}

DETERMINAREA DIVIZORILOR proprii ai unui NUMĂR

Determinarea divizorilor se poate face în 3 intervale:

A. de la 2 la n-1

Din păcate această abordare nu este eficientă, mai ales atunci când numărul

pentru care se determină divizorii are valoare foarte mare.

B. de la 2 la n / 2

Se bazează pe observația că divizorii unui număr sunt în pereche: dacă cel mai mic

divizor propriu este 2, cel mai mare ar fi n/2, dacă 3 este divizor, atunci n/3 este

divizor de asemenea, ...

C. de la 2 la

Știind că divizorii unui număr sunt în pereche: atunci e suficient să determinăm

divizorul d, iar perechea lui se va calcul cu expresia n/d. Din acest interval cel mai mare

divizor pe care ar trebui să-l determinăm ar fi .

Exemplu: pentru 24 divizorii proprii afișați 2, 3, 4, 6, 8, 12

Problemă

Se citește de la consolă un număr natural n (n>2). Să se afișeze toți divizorii

proprii ai acestui număr.

Pseudocod

citește n;

pentru d=2,sqrt(n),1 execută

| dacă n%d=0 atunci

| | SCRIE d, ’ ‘,d/n,’ ‘

| └■sf. dacă

└■ sf. pentru

24 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Implementare C++

#include <iostream>

using namespace std;

int main()

{

int n,d;

cin>>n;

for (d=2;d*d<n;d++)

{

if(n%d==0)

cout <<d<<" "<<n/d<<" ";

}

return 0;

}

FUNCȚIA lui EULER

Funcția lui Euler sau indicatorul lui Euler pentru un număr natural nenul n este

dată de numărul de numere mai mici sau egale cu n care sunt prime cu n.

Exemple: pentru n = 12, se afișează 4

deoarece sunt 4 numere ce sunt prime cu 12. Acestea sunt 1, 5, 7, 11.

Problemă

Se citește de la consolă un număr natural n ( n>2). Să se determine și să se afișeze

indicatorului lui Euler a acestui număr.

Pseudocod

citește n (numar intreg)

Dacă n%2=0 atunci

| Pentru i=3,n,2 execută

| | ci ← i

| | cn ← n

| | cât timp ci!=0 execută

| | | r ←ci

| | | ci ←cn%ci

| | | cn ←r

| | └■sf. cât timp

| | Dacă r=1 atunci SCRIE i

| | └■sf. dacă

| └■ sf. pentru

| altfel

| Pentru i=2,n,1 execută

| | ci ← i

| | cn ← n

| | Cât timp ci!=0 execută

| | | r ←ci

| | | ci ←cn%ci

| | | cn ←r

| | └■sf. cât timp

| | Dacă r=1 atunci SCRIE i

| | └■sf. dacă

| └■ sf. pentru

└■sf. dacă

25 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Implementare C++

#include <iostream>

using namespace std;

int main()

{ int n,i,ci,cn,r;

cin>>n;

if(n%2==0)

{

for(i=3;i<n;i=i+2)

{

ci=i;

cn=n;

while (ci!=0)

{

r=ci;

ci=cn%ci;

cn=r;

}

if(r==1) cout<<i<<" ";

}

}

else

{

for(i=2;i<n;i++)

{

ci=i;

cn=n;

while (ci!=0)

{

r=ci;

ci=cn%ci;

cn=r;

}

if(r==1) cout<<i<<" ";

}

}

return 0;

}

INTERCLASARE

Interclasarea este o metodă prin care, pornind de la două șiruri de elemente

ordonate, se poate obține un al treilea șir ordonat care conține elemente ale acestora.

Printre aplicațiile realizate cu ajutorul interclasării se poate face reuniunea și

intersecția a două mulțimi, dar și sortare prin interclasare.

Problemă

Se citesc elementele ordonate crescător a două șiruri: vectorul a cu n elemente și

vectorul b cu m elemente, cu indexare ce începe cu 1. Să se interclaseze crescător

elementele acestora în vectorul c.

26 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Pseudocod

citește n,m (numere naturale nenule)

pentru i=1,n,1 execută

| citește a i

└■ sf. pentru

pentru j=1,m,1 execută

| citește b j

└■ sf. pentru

i ← 1

j ← 1

k ← 0

cât timp (i<=n și j<=m) execută

| k ← k + 1

| dacă (a i < b j ) atunci

| | c k ← a i

| | i←i+1

| | altfel

| | dacă (a i > b j ) atunci

| | | c k ← b j

| | | j←j+1

| | | altfel

| | | c k ← a i

| | | i ← i + 1

| | | j ← j + 1

| | └■ sf. dacă

| └■

└■ sf. cât timp

cât timp (i<=n)

| k ← k + 1

| c k ← a i

| i ← i + 1

└■ sf. cât timp

cât timp (j<=m)

| k ← k + 1

| c k ← b j

| j ← j + 1

└■ sf. cât timp

Pentru k=1,n+m,1 execută

| SCRIE c k ‘’ ‘’

└■ sf. pentru

Implementare C++

#include <iostream>

using namespace std;

int a[100001],b[100001], c[200002], i, j, k, n, m ;

int main()

{ cin>>n>>m;

for(i=1;i<=n;i++)

{

cin>>a[i];

}

for(j=1;j<=m;j++)

{

cin>>b[j];

}

27 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

i=1;j=1;k=0;

while(i<=n && j<=m)

{ k++;

if (a[i]<b[j])

{

c[k]=a[i];

i++;

}

else

if (a[i]>b[j])

{

c[k]=b[j];

j++;

}

else

{

c[k]=a[i];

i++;

j++;

}

}

while(i<=n)

{

c[k++]=a[i++];

}

while (j<=m)

{

c[k++]=b[j++];

}

for(i=1;i<=k;k++)

{

cout<<c[i]<<" ";

}

return 0;

}

NUMĂR APROAPE PRIM

Un număr este aproape prim dacă se poate scrie ca produs de două numere

prime distincte.

Exemple: 6 = 2*3, 10=2*5, 14=2*7, 15=3*5

Problemă

Se citește de la consolă un număr natural nenul n (n>2). Să se verifice dacă este

număr aproape prim.

Pseudocod

citește n (număr natural nenul)

pentru i=1, i<=sqrt(n),1 execută

| dacă (i*(n/i)=n) atunci nr←nr+2

| └■sf. dacă

| dacă (i*i=n) atunci nr←nr-1

| └■sf. dacă

└■sf. pentru

28 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Dacă (nr=4) atunci SCRIE “este NUMĂR aproape prim”

| altfel SCRIE “nu este NUMĂR aproape prim”

└■sf. dacă

Implementare C++

#include <iostream>

using namespace std;

int n,nr=0,i;

int main ()

{

cin >> n;

for (i=1;i*i<=n;i++)

{

if (i*(n/i)==n) nr+=2;

if (i*i==n) nr--;

}

if (nr==4) cout <<"este NUMĂR aproape prim";

else cout <<"nu este NUMĂR aproape prim";

return 0;

}

NUMĂR CIURUIT

Un număr ciuruit este un număr întreg pozitiv cu proprietatea că are minim două

zerouri.

Exemple: 5090, 6000, 10062, 300500.

Problemă

Se citește de la consolă un număr natural n (n>2). Să se afișeze toate numere

ciuruite până la cel de-al n-lea număr.

Pseudocod

citește n (numar natural nenul)

nr ← 0 // numarul de numere ciuruite

i ← 0

c0 ← 0 // numarul de cifre de 0

cât timp (nr < n-1) execută

| ci←i

| c0←0

| cât timp (ci!=0) execută

| | dacă (ci%10 = 0) atunci c0←c0+1

| | └■sf. dacă

| | ci←ci/10

| └■sf. cât timp

| dacă ( c0>1) atunci

| | nr←nr+1

| | SCRIE i “ “

| └■sf. dacă

| i←i+1

└■sf. cât timp

29 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Implementare C++

#include <iostream>

using namespace std;

int main()

{

int n, nr = 0, i = 0, ci, c0 = 0;

cin >> n;

while (nr < n-1)

{

ci = i;

c0 = 0;

while (ci != 0)

{

if (ci % 10 == 0) c0++;

ci /= 10;

}

if ( c0 >= 2)

{

nr++;

cout << i << endl;

}

i++;

}

return 0;

}

NUMĂR CORECT

Numărul corect este un număr întreg cu proprietatea că suma şi produsul cifrelor

sunt pătrate perfecte.

Exemple: 1, 4, 9, 10, 22, 40, 88, 90, 100

Problemă

Se citește de la consolă un număr natural n (n>2). Să se afișeze toate numerele

corecte până la numărul n.

Pseudocod

citește n (numar natural nenul)

pentru i=1,n,1 execută

| x ← i

| s ← 0

| p ← 1

| cât timp (x!=0) execută

| | s ← s+(x%10)

| | p ← p*(x%10)

| | x ← x/10

| └■ sf. cât timp

| ok ← 1

| d ← SQRT(s)

| dacă (d*d!=s) atunci ok ← 0

| └■sf.dacă

| d ← SQRT(p)

30 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

| dacă (d*d!=p) atunci ok ← 0

| └■sf.dacă

| dacă ok>0 atunci SCRIE “NUMĂRul corect”, i, “ ”,

| └■sf.dacă

└■sf.pentru

Implementare C++

#include<iostream>

#include<cmath>

using namespace std;

int n,s,p,d,i,ok,x;

int main()

{

cin>>n;

for(i=1;i<=n;i++)

{

x=i; s=0; p=1;

while(x!=0)

{

s=s+(x%10);

p=p*(x%10);

x/=10;

}

ok=1;

d=sqrt(s);

if(d*d!=s) ok=0;

d=sqrt(p);

if(d*d!=p) ok=0;

if(ok) cout<<"este numar corect "<<i<<endl;

}

return 0;

}

NUMĂR DUBLIC

Un număr dublic este un număr întreg pozitiv cu proprietatea că are două cifre

alăturate egale.

Exemple: 1122, 900, 6332, 300500.

Problemă

Se citește de la consolă un număr natural n care are cel puțin două cifre. Să se

verifice dacă este un număr dublic.

Pseudocod

citește n (numar natural nenul)

ok←0

c1←n%10

n←n/10

cât timp (n!=0) execută

| c2←n%10

31 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

| Dacă (c1=c2) atunci ok←1

| └■sf.dacă

| n←n/10

| c1←c2

└■sf. cât timp

dacă (ok) atunci SCRIE “NUMĂRul este dublic”

| altfel SCRIE “ NUMĂRul nu e dublic”

└■ sf.dacă

Implementare C++

#include <bits/stdc++.h>

using namespace std;

int main()

{

int c1,n,ok=0,c2,n1;

cin>>n;

c1=n%10;

n=n/10;

while (n!=0)

{ c2=n%10;

if (c1==c2) ok=1;

n=n/10;

c1=c2;

}

if(ok) cout<<"numarul este dublic";

else cout<<"numarul nu este dublic";

return 0;

}

NUMĂR ECHILIBRAT

Un număr echilibrat este un număr întreg pozitiv cu proprietatea că numărul de

cifre pare este egal cu numărul de cifre impare.

Exemple: 7232, 81, 12344321.

Problemă

Se citește de la consolă un număr natural n (n>2) cu cel puțin două cifre. Să se

verifice dacă este un număr echilibrat.

Pseudocod

citește n ;

nri←0;

nrp←0;

cât timp (n!=0) execută

| Dacă (n%10%2=0) atunci nrp←nrp+1;

| | altfel nri←nri+1;

| └■sf.dacă

| n←n/10;

└■sf. cât timp

dacă(nrp=nri) atunci SCRIE “NUMĂRul este echilibrat”

| altfel SCRIE “NUMĂRul nu e echilibrat”

└■sf. dacă

32 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Implementare C++

#include <iostream>

using namespace std;

int main()

{

int nri=0,nrp=0,n;

cin>>n;

while (n!=0)

{ if(n%10%2==0) nrp++;

else nri++;

n=n/10;

}

if (nrp==nri) cout<<"numarul este echilibrat";

else cout<<"numarul nu e echilibrat";

return 0;

}

NUMĂR FERICIT

Un număr fericit este un număr întreg pozitiv cu proprietatea că prin însumarea

iterativă a pătratelor cifrelor lor, se ajunge în cele din urmă la 1.

Exemplu: 23 e număr fericit, deoarece 2²+3²=4+9=13, 1²+3²=1+9=10,

1²+0²=1+0=1.

Numere fericite până la 500: 1, 7, 10, 13, 19, 23, 28, 31, 32, 44, 49, 68, 70, 79, 82,

86, 91, 94, 97, 100, 103, 109, 129, 130, 133, 139, 167, 176, 188, 190, 192, 193, 203, 208,

219, 226, 230, 236, 239, 262, 263, 280, 291, 293, 301, 302, 310, 313, 319, 320, 326, 329,

331, 338, 356, 362, 365, 367, 368, 376, 379, 383, 386, 391, 392, 397, 404, 409, 440, 446,

464, 469, 478, 487, 490, 496.

Numerele la care acest tip de calcul duce la un rezultat diferit de 1 se numesc

numere nefericite.

sursa: www.wikipedia.org

Problemă

Se citește de la consolă un număr natural nenul n. Să se determine și să se afișeze

cel de-al n-lea număr fericit.

Pseudocod

citește n

nr←0

y←0

cât timp(nr != n) execută

| y ← y + 1

| x ← y

| repetă

| | s←0

| | cât timp(x != 0)execută

| | | c← x % 10

| | | s← s + c*c

| | | x← x / 10

| | └■sf. cât timp

| | x←s

33 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

| └■până când (s <= 9)

| dacă(s = 1) atunci

| | nr ← nr + 1

| └■sf. dacă

└■sf. cât timp

SCRIE y

Implementare C++

#include <iostream>

#include <cmath>

using namespace std;

int main()

{

int x, s = 0, c, n, nr = 0, y = 0;

cin >> n;

while (nr != n)

{

y++;

x = y;

do {

s = 0;

while (x != 0)

{

c = x % 10;

s = s + pow(c, 2);

x = x / 10;

}

x = s;

} while (s > 9);

if (s == 1) nr++;

}

cout << y;

return 0;

}

NUMĂR GENEROS

Un număr generos este un număr întreg pozitiv n cu proprietatea că suma

cifrelor lui este mai mare decât n+2.

Problemă

Se citește de la consolă un număr natural nenul n. Să se verifice dacă acesta este un

număr generos.

Pseudocod

citește n

cn←n

S←0

cât timp (n!=0) execută

| S←S+(n%10)

| n←n/10

└■sf. cât timp

Dacă (S>=n+2) atunci SCRIE “NUMĂR generos”

| altfel SCRIE “nu este NUMĂR generos”

└■sf. dacă

34 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Implementare C++

#include <iostream>

using namespace std;

int n,cn,S=0;

int main()

{

cin>>n;

cn=n;

while(n!=0)

{

S=S+(n%10);

n=n/10;

}

if(S>=cn+2) cout<<"numar generos";

else cout<<"nu este numar generos";

return 0;

}

NUMĂR GREU ÎNCERCAT

Un număr greu încercat este un număr întreg pozitiv cu proprietatea că are două

cifre între care diferența este 9.

Exemple: 89120, 5602009.

Problemă

Se citește de la consolă un număr natural n (n>2). Să se afișeze toate numere greu

încercate până la cel de-al n-lea număr.

Pseudocod

citește n (numar natural)

nr←0

i←0

cât timp (nr < n-1)

| ci←i

| c9←0

| c0←0

| cât timp (ci!=0) execută

| | dacă(ci%10 = 0) atunci c0←c0+1

| | └■sf.dacă

| | dacă(ci%10 = 9) atunci c9←c9+1

| | └■ sf.dacă

| | ci←ci/10

| └■sf. cât timp

| dacă (c9>0 && c0>0) atunci

| | nr←nr+1

| | SCRIE i “ “

| └■sf.dacă

| i←i+1

└■sf. cât timp

35 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Implementare C++

#include <iostream>

using namespace std;

int main()

{

int n, nr = 0, i = 0,ci, c9 = 0, c0 = 0;

cin >> n;

while (nr < n-1)

{

ci = i;

c9 = 0;

c0 = 0;

while (ci != 0)

{

if (ci % 10 == 0) c0++;

if (ci % 10 == 9) c9++;

ci /= 10;

}

if (c9 >= 1 && c0 >= 1)

{

nr++;

cout << i << endl;

}

i++;

}

return 0;

}

NUMĂR IMPERFECT

Numărul imperfect este un număr întreg pozitiv cu proprietatea că suma

divizorilor săi (exceptând numărul însuşi) este mai mică decât numărul dat.

Exemple: numerele 62, 70, 77, 95 au suma divizorilor mai mică decât ele însele.

Problemă

Se citește de la consolă un număr natural n (n>2). Să se afișeze toate numerele

imperfecte până la numărul n.

Pseudocod

citește n (numar natural nenul)

pentru i=1,n,1 execută

| s←1

| pentru d=2,sqrt(i),1 execută

| | dacă (i%d=0) atunci s←s+d+(n/d)

| | └■sf. dacă

| | dacă (s<n) atunci SCRIE i

| | └■sf. dacă

| └■sf. pentru

└■sf. pentru

36 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Implementare C++

#include<iostream>

using namespace std;

int n,s,i,d;

int main()

{

cin >> n;

for (i=1; i<=n; i++)

{ s=1;

for (d=2; d*d<=i; d++)

if (i%d==0) s=s+d+(n/d);

if (s<n) cout<<i<<" ";

}

return 0;

}

NUMĂR LEGAT

Numărul legat este un număr întreg cu proprietatea că diferenţa dintre oricare

două cifre consecutive este 1.

Exemple: 2343, 6765

Problemă

Se citește de la consolă un număr natural n (n>2) cu cel puțin două cifre. Să se

afișeze toate numerele legate până la numărul n.

Pseudocod

citește n (numar natural)

i←10

cât timp( i < n) execută

| ci← i

| legat ←1

| c1←ci%10

| cât timp( ci % 100 >= 10 si legat=1) execută

| | c2 ←ci/10%10

| | ci ←ci/10

| | dacă( c2-c1 !=1 si c2-c1 >0) atunci

| | | legat←0

| | └■sf.dacă

| | dacă( c1-c2 !=1 si c1-c2 >0) atunci

| | | legat ←0

| | └■sf.dacă

| | c1←c2

| └■sf. cât timp

| dacă(legat=1) atunci SCRIE i, “ “

| └■sf. dacă

| i←i+1

└■ sf. cât timp

37 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Implementare C++

#include <iostream>

using namespace std;

int main()

{

int n, i=2,ci, c1, c2,legat=0;

cin >> n;

while (i < n)

{ ci = i;

if (ci > 10)

{

while (ci%100>= 10)

{ legat = 1;

c1 = ci % 10;

c2 = ci / 10 % 10;

if (abs(c2 - c1) != 1)

{

legat = 0;

break;

}

ci /= 10;

}

}

if (legat == 1) cout << i << " ";

i++;

}

return 0;

}

NUMĂR MUNTE

Numărul munte este un număr natural nenul care are cifrele în ordine

crescătoare (de la stânga la dreapta) până la o cifră de la care cifrele sale sunt în ordine

descrescătoare.

Exemple: 2578631, 241

Se pot verifica și secvențe de tip “munte” din cadrul unui șir de n numere naturale,

cu n>=3. În acest caz, prima secvență conține numere vecine crescătoare, până la o

poziție poz, de la care numerele vecine sunt descrescătoare. Elementul xpoz se consideră

vârful muntelui.

Problemă

Se citește de la consolă un număr natural n (n>2). Să se verifice dacă acesta are

aspect de tip “munte”.

Pseudocod

citește n (numar natural)

x ← n

munte ← 1

cât timp (n>9 si n%10<(n/10)%10) execută

| n←n/10

└■ sf. cât timp

38 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

dacă (n=x sau n<10) atunci

| munte ← 0

└■ sf.dacă

cât timp (n>9 si n%10>(n/10)%10) execută

| n←n/10

└■ sf. cât timp

dacă (n>9) atunci

| munte ← 0

└■ sf.dacă

dacă (munte=1) atunci Scrie numarul are apect munte de tip

munte

| altfel Scrie numarul NU are apect munte de tip

munte

└■ sf.dacă

Implementare C++

#include <iostream>

using namespace std;

int main()

{

int n,x,c,munte=1;

cout<<"n="; cin>>n;

x=n;

while(n>9 && n%10<(n/10)%10)

n=n/10;

if(n==x || n<10) munte=0;

while(n>9 && n%10>(n/10)%10)

n=n/10;

if(n>9) munte=0;

if (munte) cout<<"numărul are aspect de munte";

else cout<<"numărul nu are aspect de munte";

return 0;

}

NUMĂR NEVRICOS

Numărul nevricos este un număr natural nenul care este egal cu triplul

produsului cifrelor sale.

Exemple: 15 are triplul produsului cifrelor este 5*1*3 = 15,

24 are triplul produsului cifrelor 2*4*3 = 24 .

Problemă

Se citește de la consolă un număr natural n (n>2). Să se afișeze toate numerele

nevricoase până la numărul n.

Pseudocod

citește n (numar natural)

pentru i=1, n, 1 execută

| x ← i

| p ← 1

| cât timp (x!=0) execută

| | p←p*x/10

| | x←x/10

| └■ sf. cât timp

39 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

| dacă 3*p=i atunci Scrie i, ‘ ‘

| └■ sf. dacă

└■ sf. pentru

Implementare C++

#include<iostream>

using namespace std;

int n, p,cx,x,i;

int main()

{

cin >> n;

for(i=1; i<=n;i++)

{

x=i; p=1;

while (x!=0)

{

p*= (x%10);

x/=10;

}

if (3*p==i) cout<<i<<" ";

}

return 0;

}

NUMĂR NOROCOS

Numărul norocos este un număr natural nenul n, pentru care pătratul lui este o

sumă de n numere naturale consecutive.

Exemple: 3 este norocos pentru că 3 * 3 = 2 + 3 + 4

7 este număr norocos pentru că 7 * 7 = 4 + 5 + 6 + 7 + 8 + 9 + 10

Problemă

Se citește de la consolă un număr natural n (n>2). Să se verifice dacă acesta este

număr norocos și dacă da, afișați cele n numere consecutive care adunate dau pătratul

acestuia.

Pseudocod

citește n (numar natural)

dacă (n%2=1) atunci

| t ← (n+1)/2

| cât timp (n!=0) execută

| | scrie t,’ + ‘

| | t←t+1

| | n←n-1

| └■ sf. cât timp

| altfel

| scrie numarul nu e norocos

└■ sf. dacă

Implementare C++

#include <iostream>

using namespace std;

40 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

int main()

{

int n,t;

cin>>n;

if(n%2)

{

t=(n+1)/2;

while(n!=0)

{

cout<<t<<" + ";

t++;

n--;

}

}

else

cout<<"numarul nu este norocos";

return 0;

}

NUMĂR OPTIM

Un număr optim este un număr întreg pozitiv cu proprietatea că suma cifrelor lui

este 8 sau conţine cifra 8.

Exemple: 1232, 80, 62, 300500.

Problemă

Se citește de la consolă un număr natural nenul n. Să se determine cel de-al n-lea

număr optim.

Pseudocod

citește n (numar natural)

i←1

coptim←0

nr←0

cât timp (nr<n) execută

| ci←i

| s←0

| coptim←0

| cât timp (ci !=0)

| | c←ci%10

| | s←s+c

| | ci←ci/10

| | Dacă(c=8) atunci coptim←8

| | └■sf. dacă

| └■sf.cât timp

| dacă(s=8 sau coptim=8) atunci nr←nr+1

| └■ sf.dacă

| i←i+1

└■ sf.cât timp

SCRIE i-1

└■ sf.dacă

41 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Implementare C++

#include <iostream>

using namespace std;

int main()

{

int n, ci , i = 1, c, s = 0, coptim = 0, nr = 0;

cin >> n;

}

while (nr < n)

{

ci = i;

s = 0;

coptim = 0;

while (ci != 0)

{

c = ci % 10;

s = s + c;

ci /= 10;

if (c == 8) coptim = 8;

}

if (s == 8 || coptim == 8) nr++;

i++;

}

cout << endl << i - 1;

return 0;

PALINDROM

Numărul palindrom este un număr întreg pozitiv egal cu oglinditul său.

Oglinditul unui număr natural se obține din numărul inițial citind cifrele acestuia

de la dreapta la stânga (în ordine inversă).

Exemple: 67876, 953359.

Problemă

Se citește de la consolă un număr natural n (n>9). Să se afișeze toate numerele

palindrom până la numărul n.

Pseudocod

citire n (numar natural)

pentru i=10,n,1 execută

| ci←i

| oglindit←0

| cât timp (ci!=0)execută

| | oglindit ← oglindit *10+ci%10

| | ci←ci/10

| └■ sf. cât timp

| dacă oglindit =i atunci

| | scrie i ,‘ ‘

| └■ sf. dacă

└■ sf. pentru

42 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Implementare C++

#include <iostream>

using namespace std;

int n,oglindit,i,ci;

int main()

{

cin>>n;

for(i=10;i<=n;i++)

{

ci=i;

oglindit=0;

while(ci!=0)

{

oglindit=oglindit*10+ci%10;

ci=ci/10;

}

if(oglindit==i) cout<<oglindit<<" ";

}

return 0;

}

NUMĂR PĂTRAT PERFECT

Un pătrat perfect este un număr întreg care este pătratul unui alt

număr. Rădăcina pătrată a unui pătrat perfect este un număr întreg.

Exemple: 9 = 3 2 , 16 = 4 2 , 25 = 5 2

Problemă

Se citește de la consolă un număr natural n (n>9). Să se verifice dacă este sau

nu, un număr pătratic (pătrat perfect).

Pseudocod

citire n (numar natural)

dacă sqrt(n)=int(sqrt(n)) atunci

| scrie DA, este numar pătrat

| altfel

| scrie NU este număr pătrat

└■ sf. dacă

Implementare C++

#include<iostream>

#include<cmath>

using namespace std;

int main()

{ int n;

cin>>n;

if(sqrt(n)==int(sqrt(n)))

cout<<"DA, este numar pătrat";

else

cout<<"NU este număr pătrat";

return 0;

}

43 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

NUMĂR PERFECT

Numărul perfect este un număr întreg egal cu suma divizorilor săi, din care se

exclude numărul însuși.

Exemple:

6=1+2+3

28=1+2+4+7+14

496=1+2+4+8+16+31+62+124+248

8.128=1+2+4+8+16+32+64+127+254+508+1016+2032+4064

sursa: www.wikipedia.org

Problemă

Se citește de la consolă un număr natural n. Să se verifice dacă este număr perfect.

Pseudocod

citire n (număr întreg)

S ← 0

pentru d=1,n/2,1 execută

| Dacă (n%d=0) atunci S←S+d

| └■ sf. dacă

└■ sf. pentru

Dacă (S=n) atunci

| SCRIE “număr perfect”

| altfel

| SCRIE “nu este număr perfect”

└■ sf. dacă

Implementare C++

#include<iostream>

using namespace std;

int n,d,S=0;

int main()

{

cin>>n;

for(d=1;d<=n/2;d++)

{

if(n%d==0)

S=S+d;

}

if(n==S)

cout<<"numarul este perfect";

else

cout<<"numarul nu este perfect";

return 0;

}

NUMĂR PITIC

Un număr pitic este un număr întreg pozitiv cu toate cifrele mai mici decât cifra 4.

Problemă

Se citește un număr n de la consola. Să se verifice dacă este sau nu, număr pitic.

44 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Pseudocod

citește n

ok ← 1

cât timp (n!=0 si ok=1)

| c←n%10

| dacă(c>4) atunci

| | ok←0

| └■sf. dacă

| n←n/10

└■sf. cât timp

dacă(ok=1) atunci

| SCRIE “ este numar pitic “

| altfel

| SCRIE “nu este numar pitic “

└■sf. dacă

Implementare C++

#include <iostream>

using namespace std;

int n,ok=1,c;

int main()

{

cin>>n;

while(n!=0 && ok)

{

c=n%10;

if(c>4) ok=0;

n/=10;

}

if(ok) cout<<"este numar pitic";

else cout<<"nu este numar pitic"

return 0;

}

NUMĂR PRIM

Un număr prim este un număr natural, mai mare decât 1, care are exact doi

divizori pozitivi: numărul 1 și numărul în sine. Acești divizori sunt improprii. Un număr

prim este deci nefactorizabil.

Opusul noțiunii de număr prim este cel de număr compus.

Exemple: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61,...

sursa: www.wikipedia.org

Problemă

Se citește de la consolă un număr natural n, (n>2). Să se afișeze toate numerele

prime până la numărul n.

Pseudocod

citește n

i ← 2

cât timp(i < n) execută

| dacă(i=2 || i=3) atunci

| | SCRIE i “ “

| | altfel

45 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

| | d←2

| | prim←1

| | cât timp (d<=sqrt(i) si

prim=1)execută

| | | dacă(i%d=0) atunci prim←0

| | | └■sf. dacă

| | | d←d+1

| | └■sf. cât timp

| └■sf. dacă

| dacă(prim=1) atunci SCRIE i , “ “

| └■sf. dacă

| i←i+1

└■sf. cât timp

Implementare C++

#include <iostream>

using namespace std;

int main()

{

int n, prim, d, i = 2;

cin >> n;

while (i < n)

{ d = 2;

if (i == 2 || i==3)

cout << i << " ";

else

{ prim = 1;

while (d*d <= i && prim)

{

if (i % d == 0) prim = 0;

d++;

}

}

if (prim == 1) cout << i << " ";

i++;

}

return 0;

}

NUMĂR PUTERNIC

Numărul puternic este un număr întreg pozitiv cu proprietatea că, dacă este

divizibil cu numărul prim p, atunci este divizibil și cu p 2 .

O listă a numerelor puternice cuprinse între 1 și 1000:

1, 4, 8, 9, 16, 25, 27, 32, 36, 49, 64, 72, 81, 100, 108, 121, 125, 128, 144, 169, 196,

200, 216, 225, 243, 256, 288, 289, 324, 343, 361, 392, 400, 432, 441, 484, 500, 512, 529,

576, 625, 648, 675, 676, 729, 784, 800, 841, 864, 900, 961, 968, 972, 1000, ..

sursa: www.wikipedia.org

Problemă

Se citește de la consolă un număr natural n (n>2). Să se afișeze toate numerele

puternice până la numărul n.

46 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Pseudocod

citește n

pentru i=4,n,1 execută

| x←i

| ok←1

| d←2

| cât timp(x!=1 si ok=1) execută

| | p←0

| | cât timp(x%d=0) execută

| | | x←x/d

| | | p←p+1

| | |

| | └■sf. cât timp

| | dacă(p=1) atunci

| | | ok←0

| | └■sf. dacă

| | d←d+1

| └■sf. cât timp

| dacă(ok=1) atunci

| | SCRIE i, “ “

| └■sf. dacă

└■sf pentru

Implementare C++

#include<iostream>

using namespace std;

int n,i,x,ok,d,p;

int main()

{

cin>>n;

for(i=4;i<=n;i++)

{

x=i;

ok=1;

d=2;

while(x!=1 && ok==1)

{

p=0;

while(x%d==0)

{ x=x/d;

p++;

}

if(p==1) ok=0;

d++;

}

if(ok==1) cout<<i<<” “;

}

return 0;

}

47 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

NUMĂR ROTUND

Numărul rotund este un număr întreg nenul care nu are niciun factor prim mai

mare decât rădăcina sa pătrată.

Numărul rotund este un număr compus (are cel puțin un divizor propriu).

Exempu: 24 are divizori pe 2 și 3, niciunul nefiind mai mare decât 4,89 rădăcina sa

pătrată.

Șirul numerelor rotunde este:

1, 4, 8, 9,12, 16, 18, 24, 25, 27, 30, 32, 36, 40, 45, 48, 49, 50, 54, 56, 60, 63, 64, 70,

72, 75, 80, 81, 84, 90, 96, 98, 100, 105, 108, 112, 120, 121, 125, 126, 128, 132, 135, 140,

144, 147, 150, 154, 160, 162, 165, 168, 169, 175, 176, 180, 182, 189, 192, 195, ...

sursa: www.wikipedia.org

Problemă

Se citește de la consolă un număr natural n (n>2). Să se afișeze toate numerele

rotunde până la cel de-al n-lea.

Pseudocod

citește n (numar natural)

y←1

cât timp (y < n) execută

| x←y

| d←2

| ok←1

| cât timp(x>1) execută

| | p←0

| | cât timp (x % d = 0) execută

| | | x←x/d

| | | p←p+1

| | └■sf. cât timp

| | dacă p=1 atunci

| | | dacă (d > sqrt(y)) atunci ok←0

| | | └■sf. dacă

| | └■sf. dacă

| | d ←d+1

| └■sf. cât timp

| dacă ok=1 atunci

| | scrie y, “ “

| └■sf. dacă

| y←y+1

└■sf. cât timp

Implementare C++

#include <iostream>

#include <cmath>

using namespace std;

int main()

{

int n,p,d,y=1,x,k;

bool ok=1;

cin >> n;

while(y<n)

{

d=2;

48 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

}

x=y;

ok=1;

while(x>1)

{

p=0;

while(x%d==0)

{

x/=d;

p++;

}

if(p)

if(d> sqrt(y)) ok=0;

d++;

}

if(ok)

cout << y << " ";

y++;

}

return 0;

NUMĂR SEMIPALIDROM

Numărul semipalindrom este un număr natural nenul în care cifrele din prima

jumătate sunt acelaşi cu cele din a doua jumătate.

Exemple: 13813 , 629.629.

Problemă

Se citește de la consolă un număr natural n (n>2). Să se verifice dacă este număr

semipalindrom.

Pseudocod

citește n

cn ← n

execută

| nr ← nr+1

| n ← n/10

└■ Cât timp (n!=0)

p←1

pentru i=0,i<nr/2,1

| p←p*10

└■ sf. pentru

dacă (nr%2=0) atunci

| dacă (cn%p=cn/p) atunci SCRIE "este semipalindrom"

| | altfel SCRIE "nu este semipalindrom"

| └■sf. dacă

└■sf. dacă

dacă (nr%2=1) atunci

| dacă (cn%p=cn/p/10) atunci SCRIE "este semipalindrom"

| | altfel SCRIE "nu este

semipalindrom"

| └■sf. dacă

└■sf. dacă

49 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Implementare C++

#include <iostream>

using namespace std;

int n,p,nr=0,cn,c,i;

int main()

{ cin>>n;

cn=n;

}

do

{ nr++;

n=n/10;

} while (n!=0);

p=1;

for(i=0; i<nr/2; i++) p*=10;

if(nr%2==0)

{

if(cn%p==cn/p) cout<<"este semipalindrom";

else cout<<"nu este semipalindrom";

}

if(nr%2==1)

{

if(cn%p==cn/p/10) cout<<"este semipalindrom";

else cout<<" nu este semipalindrom";}

return 0;

NUMĂR SUBȚIRE

Un număr subțire este un număr întreg pozitiv cu proprietatea că este mai mic

decât suma divizorilor săi fără 1 şi el însuşi.

Exemple: 24 are divizorii 2+3+4+6+8+12 = 35 < 24

Problemă

Se citește de la consolă un număr natural n (n>2). Să se afișeze toate numere

subțiri până la cel de-al n-lea.

Pseudocod

citește n (numar natural)

pentru x=1, n, 1 execută

| s ← 0

| pentru d=2, x/2,1 execută

| | dacă x%d=0 atunci

| | | s ← s+d

| | └■sf. dacă

| └■sf. pentru

| dacă x < s atunci

| | scrie x, " "

| ■sf. dacă

└■sf. pentru

50 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Implementare C++

#include <iostream>

using namespace std;

int main()

{

int n,s,d,y=1,x;

cin >> n;

for(x=1; x<=n; x++)

{

s=0;

for(d=2; d<=x/2; d++)

{

if(x%d==0)

s+=d;

}

if(x<s)

cout << x<<" ";

}

return 0;

}

NUMĂR SUPERPALINDROM

Numărul superpalindrom este un număr natural nenul ce este palindrom atât el,

cât și pătratul lui.

Numărul palindrom este un număr întreg pozitiv egal cu oglinditul său.

Oglinditul unui număr natural se obține din numărul inițial citind cifrele acestuia de la

dreapta la stânga (în ordine inversă).

Exemple:

11 care este palindrom, are pătratul (121) tot palindrom .

22, 26, 101, 111, 121, 202, 212, 264, 307

Problemă

Se citește de la consolă un număr natural n (n>2). Să se verifice dacă este număr

superpalindrom.

Pseudocod

citește n

cn ← n

cât timp (n!=0) execută

| inv ← inv*10+n%10

| n ← n/10

└■sf. cât timp

pt ← cn*cn;

cpt ← pt;

cât timp (pt!=0) execută

| invp ←invp*10+pt%10

| pt← pt/10

└■sf. cât timp

dacă (inv=cn si invp=cpt) atunci

| SCRIE "este superpalindrom"

| altfel

| SCRIE "NU este superpalindrom

└■sf. dacă

51 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Implementare C++

#include <iostream>

#include <cmath>

using namespace std;

int n,cn=0,pt=0,cpt=0,inv=0,invp=0;

int main()

{

cin>>n;

cn=n;

while(n!=0)

{

inv=inv*10+n%10;

n=n/10;

}

pt=pow(cn,2);

cpt=pt;

while(pt!=0)

{

invp=invp*10+pt%10;

pt=pt/10;

}

if(inv==cn && invp==cpt)

cout << "Este Superpalindrom";

else

cout << "Nu este Superpalindrom ";

return 0;

}

NUMĂR SUPERPERFECT

Un număr supraperfect este un număr întreg pozitiv ce are suma divizorilor săi

(exceptând numărul însuşi) mai mare decât numărul dat.

Problemă

Se citește de la consola un număr n (n>2). Să se verifice dacă acest număr este

supraperfect sau nu.

Pseudocod

citește n

pentru d=1,n/2,1 execută

| dacă (n%d=0) atunci

| | s←s+d

| └■sf. dacă

└■sf. pentru

dacă(s>n) atunci SCRIE “este numar supraperfect “

| altfel SCRIE “nu este numar supraperfect “

└■sf. dacă

Implementare C++

#include<iostream>

using namespace std;

int n,d,s=1;

52 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

int main()

{

cin>>n;

for(d=2;d<=n/2;d++)

if(n%d==0)

s=s+d;

if(n<s) cout<<"numarul "<<n<<" este supraperfect";

else

return 0;

}

cout<<"numarul "<<n<<" nu este supraperfect";

NUMĂR SUPERPRIM

Numărul superprim este un număr întreg pozitiv cu proprietatea că, dacă el este

prim, și toate prefixele sale sunt de asemeni prime.

Exemple:

313 este superprim pentru că 313 este prim și 31, 3 sunt prime

2339 este superprim pentru că 2339 este prim și 233, 23, 2 sunt prime

Problemă

Se citește de la consolă un număr natural n, (n>2). Să se afișeze toate numerele

superprime până la numărul n.

Pseudocod

citește n (numar natural)

pentru i=3,n,1 execută

| ok←1

| prim←1

| x←i

| dacă(x%2=0) atunci

| | prim←0

| | altfel

| | d←3

| | cât timp(x%d!=0 si d*d<=x) execută

| | | d←d+2

| | └■sf. cât timp

| | dacă(x%d=0) atunci prim←0

| | └■sf. dacă

| └■sf. dacă

| dacă(prim=1) atunci

| | cât timp(x!=0 si ok=1) execută

| | | x←x/10

| | | dacă(x%2=0) atunci

| | | | prim←0

| | | | altfel

| | | | d←3

| | | | cât timp(x%d!=0 si d*d<=x) execută

| | | | | d←d+2

| | | | └■sf Cât timp

| | | | dacă(x%d=0) atunci prim←0

| | | | └■sf dacă

| | | └■sf dacă

53 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

| | | dacă(prim=0) atunci ok←0

| | | └■sf dacă

| | └■sf. cât timp

| └■sf. dacă

| dacă (ok=1) atunci

| | x ← i

| | cât timp(x!=0) execută

| | | SCRIE x , “ “

| | | x←x/10

| | └■sf. cât timp

| └■sf. dacă

└■sf. pentru

Implementare C++

#include<iostream>

using namespace std;

int n,i,x,ok,d,prim;

int main()

{

cin>>n;

for(i=3;i<=n; i++)

{

ok=1; prim=1; x=i;

if(x%2==0) prim=0;

else

{

d=3;

while(x%d!=0 && d*d<=x) d=d+2;

if(x%d==0) prim=0;

}

if(prim==1)

while(x!=0 && ok)

{ x=x/10;

if(x%2==0) prim=0;

else

{

d=3;

while(x%d!=0 && d*d<=x) d=d+2;

if(x%d==0) prim=0;

}

if(prim==0) ok=0;

}

if(ok==0)

{x=i;

while(x!=0)

{

cout<<x<<" ";

x/=10;

cout<<endl;

}

}

}

return 0;

}

54 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

NUMĂR VALE

Numărul vale este un număr natural nenul care are cifrele în ordine

descrescătoare (de la stânga la dreapta) până la o cifră de la care cifrele sale sunt în

ordine crescătoare.

Exemple: 8531246, 947

Se pot verifica și secvențe de tip “vale” din cadrul unui șir de n numere naturale, cu

n>=3. În acest caz, prima secvență conține numere vecine descrescătoare, până la o

poziție poz, de la care numerele vecine sunt crescătoare. Elementul xpoz se consideră

adâncitura văii.

Problemă

Se citește de la consolă un număr natural n>2. Să se verifice dacă acesta are aspect de

vale.

Pseudocod

citește n (numar natural)

x ← n

vale ← 1

cât timp (n>9 si n%10>(n/10)%10) execută

| n←n/10

└■ sf. cât timp

dacă (n=x sau n<10) atunci

| vale ← 0

└■ sf.dacă

cât timp (n>9 si n%10<(n/10)%10) execută

| n←n/10

└■ sf. cât timp

dacă (n>9) atunci

| vale ← 0

└■ sf.dacă

dacă (vale=1) atunci Scrie numarul are apect munte de tip munte

| altfel Scrie numarul NU are apect munte de tip

munte

└■ sf.dacă

Implementare C++

#include <iostream>

using namespace std;

int main()

{

int n,x,c,vale=1;

cout<<"n=";cin>>n;

x=n;

while(n>9&&n%10>(n/10)%10)

n=n/10;

if(n==x || n<10) vale=0;

while(n>9 && n%10<(n/10)%10)

n=n/10;

if(n>9) vale=0;

if(vale) cout<<"numărul are aspect de vale";

else cout<<"numărul nu are aspect de vale";

return 0;

}

55 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

NUMERE în ECHER

Numerele în echer sunt perechea de numere care au același număr de cifre, iar

suma cifrelor de pe aceeași poziție este 9.

Problemă

Se citește de la consolă o pereche de două numere naturale nenule. Să se verifice

dacă acestea sunt numere în echer.

Pseudocod

citește x,y

ok←1

cât timp (x!=0 si y!=0) execută

| dacă x%10+y%10!=9 atunci ok←0

| x←x/10

| y←y/10

└■sf. cât timp

dacă (ok=1 si x=0 si y=0) atunci SCRIE “sunt in echer”

| altfel SCRIE “nu sunt in echer”

└■sf. dacă

Implementare C++

#include <iostream>

using namespace std;

int x,y,ok=1;

int main()

{ cin>>x>>y;

while(x!=0 && y!=0 && ok)

{ if(x%10+y%10!=9) ok=0;

x=x/10;

y=y/10;

}

if(ok && x==0 && y==0) cout<<"sunt numere in echer";

else cout<<"nu sunt numere in echer";

return 0;

}

NUMERE PITAGOREICE

Numerele pitagoreice sunt triplete de numere naturale ce verifica relatia din

teorema lui Pitagora.

Oricare ar fi trei numere pozitive a, b, c astfel încât a 2 + b 2 = c 2 , există un triunghi

cu laturi de lungimi a, b, c, iar unghiul dintre laturile de lungimi a și b va fi drept.

Exemple:

3 4 5

5 12 13

6 8 10

7 24 25

8 15 17

Problemă

Se citește de la consolă un număr natural n. Să se afișeze toate tripletele

pitagoreice în care valorile laturilor triunghiului sunt până la valoarea n.

56 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Pseudocod

citește n;

pentru a=1,n,1 execută

| pentru b=a+1,n,1 execută

| | f←a*a + b*b

| | c←int(sqrt(a*a + b*b))

| | dacă (f=c*c si c<n) atunci

| | | SCRIE a , b , c /n

| | └■sf. dacă

| └■sf. pentru

└■sf. pentru

Implementare C++

#include <iostream>

#include <cmath>

using namespace std;

int main()

{

int n,a,b,c,f;

cin >> n;

for(a=1; a<=n; a++)

{

for(b=a+1; b<=n; b++)

{

f = a*a +b*b;

c = int(sqrt(a*a + b*b));

if(f == c*c && c < n)

cout << "("<< a << "," << b << "," << c <<

")\n";

}

}

return 0;

}

NUMERE PRIETENE

Numerele prietene sau amiabile sunt perechile de numere în care fiecare număr

în parte este suma divizorilor (toți divizorii proprii și 1) celuilalt număr (cu alte cuvinte

fiecare număr este suma alicotă a celuilalt număr).

Primele seturi de numere prietene sunt (220, 284), (1184, 1210), (2620, 2924),

(5020, 5564), (6232, 6368). Se spune că Pitagora la întrebarea cine este Prietenul? a

răspuns: "Acela care este alt eu, ca numerele 220 și 284".

Exemplu: 220 și 284

Divizorii lui 220 sunt 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 și 110, iar suma acestora este

284. Divizorii lui 284 sunt 1, 2, 4, 71 și 142, iar suma acestora este 220.

sursa: www.wikipedia.org

Problemă

Se citesc de la consolă două numere naturale a și b. Să se verifice dacă sunt

numere prietene.

Pseudocod

citire a,b

Sa ←0

57 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

pentru d=1,a/2,1 execută

| dacă(a%d=0) atunci

| | Sa ← Sa+ d

| └■sf. dacă

└■sf. pentru

Sb ←0

pentru d=1,b/2,1 execută

| dacă(b%d=0) atunci

| | Sb ← Sb+ d

| └■sf. dacă

└■sf. pentru

dacă(Sa=b și Sb=a) atunci

| SCRIE “numere prietene”

| altfel

| SCRIE “nu sunt numere prietene”

└■sf. dacă

Implementare C++

#include <iostream>

using namespace std;

int a,b,Sa=0,Sb=0,d;

int main()

{

cin>>a>>b;

for(d=1; d<=a/2;d++)

if(a%d==0) Sa=Sa+d;

for(d=1; d<=b/2;d++)

if(b%d==0) Sb=Sb+d;

if(Sa==b && Sb==a) cout<<"Numere prietene";

else cout<<"Nu sunt numere prietene";

return 0;

}

OGLINDITUL unui număr

Oglinditul unui număr natural se obține din numărul inițial parcurgând cifrele

acestuia de la dreapta la stânga (în ordine inversă).

Exemple: n = 5623, oglinditul este 3265

n = 82000, oglinditul este 28

Problemă

Se citește de la consolă un număr natural nenul n (n>2). Să se afișeze oglinditul

(inversul) acestui număr.

Pseudocod

citire n (numar natural nenul)

oglindit←0

cât timp (n!=0)execută

| oglindit ← oglindit *10+n%10

| n←n/10

└■ sf. cât timp

SCRIE oglindit

58 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Implementare C++

#include <iostream>

using namespace std;

int n, oglindit =0;

int main()

{

cin>>n;

while(n!=0)

{

oglindit = oglindit *10+n%10;

n=n/10;

}

cout<< oglindit;

return 0;

}

METODA BULELOR

Metoda bulelor (Bubble Sort) este o metodă de sortare a unui șir de numere.

Dacă vrem să ordonăm crescător vectorul v, de lungime n, indexat de la 1, metoda

bulelor presupune:

- compararea fiecărei perechi de două elemente succesive

- dacă cele două elemente vecine nu sunt în relația dorită (xi<=xi+1, pentru

sortarea crescătoare și xi>=xi+1, pentru sortarea descrescătoare), atunci

elementele se interschimbă între ele

- dacă se ajunge la finalul șirului, parcurgerea șirului se reia, repetând procedeul

până la prima parcurgere fără nicio interschimbare

Problemă

Se citește un șir cu n elemente (n>2). Să se ordoneze crescător șirul, folosind

metoda bulelor.

Pseudocod

citește n (numar natural)

pentru i=1,n,1 execută

| citește x i

└■sf. pentru

repetă

| schimb←0

| pentru i=1,n-1,1 execută

| | Dacă (x i >=x i+1 ) atunci

| | | aux ← x i

| | | x i ← x i+1

| | | x i+1 ← aux

| | | schimb← 1

| | └■sf. dacă

| └■sf. pentru

└■ până când(schimb=0)

pentru i=1,n,1 execută

| SCRIE x i , ‘ ‘

└■sf. pentru

59 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Implementare C++

#include <iostream>

using namespace std;

int x[100],i,schimb,n,aux;

int main()

{

cout<<"Dati n: ";cin>>n;

for(i=1;i<=n;i++)

{

cin>>x[i];

}

do

{

schimb=0;

for(i=1;i<n;i++)

if(x[i]>x[i+1])

{

aux=x[i];

x[i]=x[i+1];

x[i+1]=aux;

schimb=1;

}

} while(schimb!=0);

for(i=1;i<=n;i++)

cout<<x[i]<<" ";

return 0;

}

SORTARE prin INSERTIE

Sortarea prin inserție este o metodă de ordonare a unui șir de numere.

Dacă vrem să ordonăm crescător vectorul v, de lungime n, indexat de la 0, metoda

sortării prin inserție presupune:

- presupunem primul element sortat (avem o secvență cu un element ordonat)

- vom insera elementul v2 în secvența sortată, astfel încât aceasta să fie ordonată.

Vom insera în stânga fiecare element vi pe poziția pe care o ocupă în

subsecvența sortată. Pentru a “face loc” elementului vi vom deplasa spre

dreapta toate elementele mai mari decât el. Elementul vi va fi așezat pe prima

poziție de după primul element mai mic decât vi.

- procedeul se repetă pentru fiecare element vi din șir până va fi sortat întregul

șir.

Problemă

Se citește un șir cu n elemente (n>2). Să se ordoneze crescător șirul, folosind

sortarea prin inserție.

Pentru implementarea algoritmului vom parcurge vectorul cu indicele i. Vom

obține secvențe de i elemente sortate, valorilor vi făcându-li-se loc în secvențele de la 0

la i-1 (din stânga).

60 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Pseudocod

citește n (numar natural)

pentru i=0,n-1,1 execută

| citește v i

└■sf. pentru

pentru i=1,n-1,1 execută

| x ← v i

| p←i-1

| cât timp ( p >= 0 si v i > x) execută

| | v i+1 ← v i

| | p←p-1

| └■ sf. cât timp

| v i+1 ← x

└■ sf. pentru

pentru i=0,n-1,1 execută

| SCRIE v i

└■ sf. pentru

Implementare C++

#include<iostream>

using namespace std;

int main()

{

int n, v[100],x,p,i;

cin >> n;

for (int i = 0; i < n; i++)

cin >> v[i];

for (int i = 0; i < n; i++)

{

x = v[i];

p = i - 1;

while (p >= 0 && v[p] > x)

{

v[p + 1] = v[p];

p--;

}

v[p + 1] = x;

}

for (i = 0; i < n; i++)

cout << v[i] << " ";

return 0;

}

SORTARE prin NUMĂRARE

Sortarea prin numărare este o metodă de ordonare a unui șir de numere.

Dacă vrem să ordonăm crescător vectorul v, de lungime n, indexat de la 0, metoda

sortării prin numărare presupune să determinăm poziția în care inserăm fiecare

element în șirul ordonat.

Pentru implementare vom folosi 3 vectori:

- vectorul sursă x în care avem elementele nesortate,

- vectorul destinație y în care vom depozita elementele sortate,

61 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

- vectorul numărator cnt în care, pentru fiecare element, vom determina poziția

din șirul sortat.

Cei 3 vectori au aceeași lungime.

Parcurgând vectorul sursă vom număra pentru fiecare element xi câte elemente

mai mici decât el sunt în șir. Rezultatul se stochează în vectorul numărător pe aceeași

poziție pe care o are elementul xi în vectorul sursă.

Vom depune în vectorul destinație, pe poziția dată de valoarea din vectorul

numărator, fiecare element din vectorul sursă.

Problemă

Se citește un șir cu n elemente (n>2). Să se ordoneze crescător șirul, folosind

sortarea prin numărare.

Pseudocod

citește n

pentru i=0,n-1,1 execută

| citește x i

└■sf. pentru

pentru i=0,n-2,1 execută

| pentru j=i+1,n-1,1 execută

| | dacă x i < x j atunci cnt j ← cnt j + 1

| | | altfel cnt i ← cnt i + 1

| | └■ sf. dacă

| └■ sf. pentru

└■ sf. pentru

pentru i=0,n-1,1 execută

| y[cnt i ] ← x i

└■ sf. pentru

pentru i=0,n-1,1 execută

| SCRIE y i

└■ sf. pentru

Implementare C++

#include<iostream>

using namespace std;

int x[100], y[100],cnt[100];

int n,i,j;

int main()

{

cin >> n;

for (i = 0; i < n; i++) cin >> x[i];

for (i = 0; i < n-1; i++)

for (j = i+1; j < n; j++)

if ( x[i] < x[j]) cnt[j]++;

else cnt[i]++;

for (i = 0; i < n; i++) y[cnt[i]]=x[i];

}

for (i = 0; i < n; i++) cout << y[i] << " ";

return 0;

62 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

SORTARE prin SELECTIE

Sortarea prin selecție este o metodă de ordonare a unui șir de numere.

Dacă vrem să ordonăm crescător vectorul v, de lungime n, indexat de la 1, metoda

sortării prin selecție presupune:

- comparăm elementul de pe prima poziție cu toate celelalte de după el,

selectând minimul din șir. Pe prima poziție din vector vom plasa cea mai mică

valoare a șirului. Vom avea o secvență ordonată cu un element.

- pentru a doua poziție procedăm la fel: comparăm elementul de pe poziția doi cu

toate celelalte de după el, selectând al doilea minim din șir. Vom avea astfel,

primele două elemente sortate.

- procedul se repetă pentru toate elementele vectorului, până la penultimul

element pe care-l comparăm cu ultimul.

Pentru implementarea algortimului vom parcurge vectorul cu indicele i, iar

elementele de după cel cu indicele i, le vom parcurge cu indicele j.

Dacă elementele v i și v j nu sunt în relația dorită (v i <=v j , pentru sortarea

descrescătoare) le interschimbăm. Vom obține secvențe de i elemente sortate, indicele i

incrementându-se până la n-1.

Problemă

Se citește un șir cu n elemente (n>2). Să se ordoneze crescător șirul, folosind

sortarea prin selecție.

Pseudocod

citește n

pentru i=1,n,1 execută

| citește v i

└■ sf. pentru

pentru i=1,n-1,1 execută

| pentru j=i+1,n,1 execută

| | Dacă v i > v j atunci

| | | aux← v i

| | | v i ← v j

| | | v j ←aux

| | └■ sf. dacă

| └■ sf. pentru

└■ sf. pentru

pentru i=1,n,1 execută

| SCRIE v i

└■ sf. pentru

Implementare C++

#include<iostream>

using namespace std;

int main()

{

int n, v[100],i,aux,j;

cin >> n;

for (i = 1; i <= n; i++)

cin >> v[i];

for (i = 1; i < n; i++)

{

63 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

}

for (j = i + 1; j <= n; j++)

if (v[i] > v[j])

{

aux = v[i];

v[i] = v[j];

v[j] = aux;

}

}

for (i = 1; i <= n; i++)

cout << v[i] << " ";

return 0;

REZOLVARE ecuație de GRAD I

Se citesc de la consolă două numere a și b ce reprezintă coeficienții ecuației de

gradul întâi. Să se calculeze și să se afișeze rădăcina acestei ecuații.

a x + b = 0

Pseudocod

citește a,b

dacă (a=0) atunci

| dacă(b=0) atunci SCRIE "o infinitate de solutii"

| | altfel

| | SCRIE"imposoibil"

| └■sf. dacă

| altfel

| x ←-b/a

| SCRIE x

└■sf. dacă

Implementare C++

#include<iostream>

using namespace std;

float a,b,x;

int main()

{

cin>>a>>b;

if(a==0)

if(b==0) cout<<"o infinitate de solitii";

else cout<<"imposibil";

else cout<<-b/a;

return 0;

}

REZOLVARE ecuatie de GRAD II

Se citesc de la consolă trei numere a, b și c ce reprezintă coeficienții ecuației de

gradul al II-lea. Să se calculeze și să se afișeze rădăcinile ecuației.

ax 2 + bx + c = 0

64 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Pseudocod

citeste a,b,c

D ← b*b+4*a*c

dacă (D<0) atunci SCRIE "soluții complexe"

| altfel

| dacă(D=0) atunci

| | x1←-b/(2*a)

| | x2←x1

| | SCRIE "soluții reale și egale",x1

| | altfel

| | x1←(-b+sqrt(D))/(2*a)

| | x2←(-b-sqrt(D))/(2*a)

| | SCRIE "soluții reale și

diferite",x1,x2

| └■sf. dacă

└■sf. dacă

Implementare C++

#include <iostream>

#include <cmath>

using namespace std;

int a,b,c,D;

float x1,x2;

int main()

{

cin>>a>>b>>c;

D=b*b-4*a*c;

if (D<0) cout<<"soluții complexe";

else if (D==0)

{

x1=-b/(2*a);

x2=x1;

cout<<"soluții reale și egale"<<x1;

}

else

{

x1=(-b+sqrt(D))/(2*a);

x2=(-b-sqrt(D))/(2*a);

cout<<"soluții reale și diferite"<<x1<<"

"<<x2;

}

return 0;

}

SIMPLIFICAREA unei FRACTII

Una dintre metodele de simplificare a unei fracții este determinarea divizorilor

comuni numitorului și numărătorului. Pentru eficientizarea căutării divizorilor, se va

determina minimul acestora.

O altă metodă, mult mai uzuală, este determinarea celui mai mare divizor comun

dintre numărător și numitor, cu ajutorul algoritmului lui Euclid.

65 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Problemă

Se citesc de la consolă două numere naturale nenule ce reprezintă

numărătorul și numitorul unei fracții. Să se afișeze această fracție sub formă

ireductibilă.

Pseudocod

citește nr, nm (numere naturale nenule)

a ← nr

b ← nm

dacă (a<=b) atunci minn ← a

| altfel minn ← b

└■sf. dacă

pentru d=2,minn,1 execută

| dacă (a%d==0 si b%d==0) atunci

| | a ← a/d

| | b ← b/d

| | d ← d-1

| └■sf. dacă

└■sf. pentru

dacă (a!=nr si b!=nm) atunci

| SCRIE fractia simplificata

e,a,’/’,b

| altfel

| SCRIE fractia ireductibila

└■sf. dacă

Implementare C++

#include <iostream>

using namespace std;

int main()

{

int a,b,minn,nr,nm,d;

cout<<"dati numaratorul si numitorul";

cin>>nr>>nm;

a=nr;

b=nm;

if(a<b) minn=a;

else minn=b;

for(d=2; d<=minn; d++)

if(a%d==0 && b%d==0)

{ a/=d;

b/=d;

d--;

}

if (a!=nr && b!=nm)

cout<<"fractia simplificata este "<<a<<"/"<<b;

else

cout<<"fractie ireductibila";

return 0;

}

66 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

SIRUL lui FIBONACCI

Numerele Fibonacci sunt definite prin următoarea relație de recurență:

Fn = Fn-1 + Fn-2

cu valorile inițiale F1 = 1, F2 = 1 sau F0 = 1, F1 = 1.

Astfel, fiecare număr Fibonacci este suma celor două numere Fibonacci anterioare,

rezultând secvența: 0, 1,1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, …

Problemă

Se citește de la consolă un număr natural nenul n. Să se afișeze termenii șirului lui

Fibonacci până la al n-lea, primul termen fiind 1.

Pseudocod

citește n

dacă (n<=2) atunci SCRIE "1˽1"

| altfel

| F1←1

| F2←1

| SCRIE "1 1 "

| Pentru i=3,n,1 execută

| | Fn←F1+F2

| | SCRIE "Fn˽"

| | F1←F2

| | F2←Fn

| └■sf. pentru

└■sf. dacă

Implementare C++

#include <iostream>

using namespace std;

int n,F1=1,F2=1,Fn,i;

int main( )

{

cin>>n;

if (n<=2) cout<<"1 1 ";

else

{ F1=1;

F2=1;

cout<<"1 1 ";

for (i=3;i<=n;i++)

{

Fn=F1+F2;

cout<<" "<<Fn;

F1=F2;

F2=Fn;

}

}

return 0;

}

67 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

SISTEM de 2 ecuatii liniare cu 2 NECUNOSCUTE

Se dă un sistem de două ecuații cu două necunoscute de forma

a1x + b1y = c1

a2x + b2y = c2

Pentru rezolvarea acestui sistem se poate folosi metoda reducerii sau metoda

substituției. Soluțiile acestui sistem se calculează astfel:

x= Dx / Ds

y = Dy / Ds

Unde dx , dy și ds sunt:

Dx = b2*c1 – b1*c2

Dy = a1*c2 – a2*c1

Ds = a1*b2 – b1*a2

Problemă

Se citesc de la consolă două perechi de câte trei numere întregi ce reprezintă

coeficienții a două ecuații liniare cu două necunoscute. Să se determine și să se afișeze

soluțiile acestui sistem.

Pseudocod

citește a1, b1, c1, a2, b2, c2 (numere întregi)

Dx ← b2*c1 – b1*c2

Dy ← a1*c2 – a2*c1

Ds ← a1*b2 – b1*a2

dacă Ds=0 atunci

| dacă Dx=0 atunci

| | SCRIE sistem nedeterminat

| | altfel

| | SCRIE sistem incompatibil

| └■ sf. dacă

| altfel

| x ← Dx / Ds

| y ← Dy / Ds

| SCRIE solutiile sunt, x, ‘ ‘ , y

└■ sf. dacă

Implementare C++

#include <iostream>

using namespace std;

int a1,b1,c1,a2,b2,c2;

float Dx,Dy,Ds,x,y;

int main()

{

cout<<"dati coeficientii primei ecuatii ";

cin>>a1>>b1>>c1;

cout<<"dati coeficientii ecuatii 2 ";

cin>>a2>>b2>>c2;

Dx = b2*c1-b1*c2;

Dy = a1*c2-a2*c1;

Ds = a1*b2-b1*a2;

if (Ds==0)

if(Dx==0) cout<<"sistem nedeterminat";

else cout<<"sistem incompatibil";

68 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

}

return 0;

else

{

}

x = Dx / Ds;

y = Dy / Ds;

cout<<" solutiile sunt "<<x<<" "<<y;

SISTEM de 3 ecuatii liniare cu 3 NECUNOSCUTE

Se dă un sistem de trei ecuații cu trei necunoscute de forma

a1x + b1y + c1z = d1

a2x + b2y + c2z = d2

a3x + b3y + c3z = d3

Pentru rezolvarea acestui sistem se poate folosi regula lui Cramer. Aplicând

formulele lui Cramer, soluțiile acestui sistem se calculează astfel:

x= Dx / Ds

y = Dy / Ds

z = Dz / Ds

Unde Dx , Dy, Dz și Ds sunt:

Dx = d1*b2*c3 + d2*b3*c1 + d3*b1*c2 – d3*b2*c1 – d2*b1*c3 – d1*b3*c2

Dy = a1*d2*c3 + a2*d3*c1 + a3*d1*c2 – a3*d2*c1 – a2*d1*c3 – a1*d3*c2

Dz = a1*b2*d3 + a2*b3*d1 + a3*b1*d2 – a3*b2*d1 – a2*b1*d3 – a1*b3*d2

Ds = a1*b2*c3 + a2*b3*c1 + a3*b1*c2 – a3*b2*c1 – a2*b1*c3 – a1*b3*c2

Problemă

Se citesc de la consolă trei perechi de câte patru numere întregi ce reprezintă

coeficienții a trei ecuații liniare cu trei necunoscute. Să se determine și să se afișeze

soluțiile acestui sistem.

Pseudocod

citește a1,b1,c1,d1,a2,b2,c2,d2,a3,b3,c3,d3 (numere întregi)

Dx ← d1*b2*c3+d2*b3*c1+d3*b1*c2-d3*b2*c1-d2*b1*c3-d1*b3*c2

Dy ← a1*d2*c3+a2*d3*c1+a3*d1*c2-a3*d2*c1-a2*d1*c3-a1*d3*c2

Dz ← a1*b2*d3+a2*b3*d1+a3*b1*d2-a3*b2*d1-a2*b1*d3-a1*b3*d2

Ds ← a1*b2*c3+a2*b3*c1+a3*b1*c2-a3*b2*c1-a2*b1*c3-a1*b3*c2

dacă Ds=0 atunci

| SCRIE sistem nedeterminat

| altfel

| x ← Dx / Ds

| y ← Dy / Ds

| z ← Dz / Ds

| SCRIE solutiile sunt, x, ‘ ‘ , y, ‘ ‘,z

└■ sf. dacă

Implementare C++

#include <iostream>

using namespace std;

int a1,b1,c1,d1,a2,b2,c2,d2,a3,b3,c3,d3;

float Dx,Dy,Dz,Ds,x,y,z;

int main()

69 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

{

}

cout<<"dati coeficientii primei ecuatii ";

cin>>a1>>b1>>c1>>d1;

cout<<"dati coeficientii ecuatii 2 ";

cin>>a2>>b2>>c2>>d2;

cout<<"dati coeficientii ecuatii 3 ";

cin>>a3>>b3>>c3>>d3;

Dx = d1*b2*c3+d2*b3*c1+d3*b1*c2-d3*b2*c1-d2*b1*c3-d1*b3*c2;

Dy = a1*d2*c3+a2*d3*c1+a3*d1*c2-a3*d2*c1-a2*d1*c3-a1*d3*c2;

Dz = a1*b2*d3+a2*b3*d1+a3*b1*d2-a3*b2*d1-a2*b1*d3-a1*b3*d2;

Ds = a1*b2*c3+a2*b3*c1+a3*b1*c2-a3*b2*c1-a2*b1*c3-a1*b3*c2;

if (Ds==0)

cout<<"sistem nedeterminat";

else

{

x = Dx / Ds;

y = Dy / Ds;

z = Dz / Ds;

cout<<" solutiile sunt "<<x<<" "<<y<<" "<<z;

}

return 0;

SEPARAREA CIFRELOR UNUI NUMĂR

Diverse operații matematice presupun prelucrarea cifrelor unui număr cu mai

multe cifre. Prin împărțirea unui număr la 10 putem să separăm cifrele lui din partea

dreaptă spre stânga, dacă reținem restul împărțirii.

Problemă

Se citește de la consolă un număr natural n. Să se afizeze cifrele acestuia.

Pseudocod

citire n

cât timp (n!=0)

| c ← n%10

| scrie c

| n ← n/10

└■sf. cât timp

Implementare C++

#include <iostream>

using namespace std;

int n,c;

int main()

{

cin>>n;

while(n!=0)

{

c=n%10;

cout<<c<<endl;

n/=10;

}

return 0;

}

70 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

SUMĂ ARMONICĂ

Suma armonică a unui număr întreg pozitiv se obține prin însumarea produsului

dintre cifrele lui și poziția din cadrul numărului. Cifra unităților se consideră prima cifră,

iar numărarea cifrelor continuă spre dreapta cu cifra zecilor, a sutelor, …

Exemplu: pentru 1859, suma este 47 = 1*9 + 2*5 + 3*8 + 4*1

Problemă

Se citește de la consolă un număr natural n cu cel puțin două cifre. Să se

determine și să se afișeze suma armonică a cifrelor acestuia.

Pseudocod

citește n

cnt ← 0

cât timp n != 0 execută

| c ← n % 10

| cnt++

| s ← s + c * cnt

| n ← n /10

└■sf. cât timp

SCRIE s

Implementare C++

#include<iostream>

using namespace std;

int n,s=0, cnt=0, c;

int main()

{

cout << "dati numarul ";

cin >> n;

while(n != 0)

{ c = n% 10;

cnt++;

s = s +c *cnt;

n/=10;

}

cout << s;

return 0;

}

TRANSFORMARE A UNUI NUMĂR DIN BAZA 10 IN BAZA B

Algoritmul de transformare a unui număr din baza 10 în baza b presupune

scrierea numărului din baza 10 cu cifrele bazei de la 0 la b-1.

Exemple: 10(10) =2(2) ;

24(10)=11000(2) ;

174(10)=10101110(2);

71 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Problemă

Să se afișeze scrierea numărului n din baza 10 în baza b.

Pseudocod

citește n,b

nr ← 0

p←1

cât timp (n>=b) execută

| r←n%b

| nr←nr+r*p

| n←n/b

| p←p*10

└■sf. dacă

nr ← nr+n*p

SCRIE nr

Implementare C++

#include <iostream>

using namespace std;

int n,b,r,nr=0,p=1;

int main()

{

cout<<"dati numarul in baza 10";

cin>>n;

cout<<"dati baza ";

cin>>b;

while (n>=b)

{

r=n%b;

nr=nr+r*p;

n=n/b;

p=p*10;

}

nr=nr+n*p;

cout<<"numarul din baza 10 in baza "<<b<<" este "<<nr;

return 0;

}

TRANSFORMARE A UNUI NUMĂR DIN BAZA B IN BAZA 10

Algoritmul de transformare a unui număr din baza b în baza 10 presupune

scrierea numărului din baza b cu cifrele bazei 10 (de la 0 până la 9).

Exemple: 21(3)=7(10)

65(7)=47(10)

14(2)=6(10)

72 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Problemă

Să se afișeze scrierea numărului n din baza b în baza 10.

Pseudocod

citește n,b

nr (10) ←0

p←1

cât timp (n!=10) execută

| r←n%10

| nr (10) ←nr (10) +r*p

| n←n/10

| p←p*b

└■sf. cât timp

SCRIE nr (10)

Implementare C++

#include <iostream>

using namespace std;

int n,b,r,nr=0,p=1;

int main()

{ cout<<"dati numarul in baza b ";

cin>>n;

cout<<"dati baza ";

cin>>b;

while (n!=0)

{

r=n%10;

nr=nr+r*p;

n=n/10;

p=p*b;

}

cout<<"numarul din baza "<<b<<" in baza 10 este "<<nr;

return 0;

}

VERIFICARE laturi TRIUNGHI

Perechi de trei numere întregi pozitive pot forma laturile unui triunghi.

Exemple:

5, 5, 5 => pot forma un triunghi echilateral

8, 8, 14 => pot forma un triunghi isoscel

3, 4, 5 => pot forma un triunghi dreptunghic

3, 6, 10 => nu pot forma un triunghi

Problemă

Se citesc de la consolă trei numere întregi pozitive a,b și c. Să se verifice dacă pot

forma laturile unui triunghi. În cazul în care pot constitui un triunghi, să se afișeze ce fel

de triunghi pot forma.

73 Culegere de algoritmi elementari la informatică


Coșniță Emilia - Felicia

Pseudocod

citește a,b,c

dacă a+b>c si a+c>b si b+c>a atunci

| dacă a=b si b=c atunci SCRIE triunghi echilateral

| | altfel

| | dacă a=b sau b=c sau a=c atunci SCRIE triunghi isoscel

| | | altfel

| | | dacă a*a+b*b=c*c sau b*b+c*c=a*a sau a*a+c*c=b*b atunci

| | | | SCRIE triunghi dreptunghic

| | | | altfel SCRIE triunghi oarecare

| | | └■ sf. dacă

| | └■ sf. dacă

| └■ sf. dacă

| altfel

| SCRIE nu pot forma laturile triunghiului

└■ sf. dacă

Implementare C++

#include <iostream>

using namespace std;

int main()

{

unsigned a,b,c;

int ok=1;

cout<<"dati numerele ";

cin>>a>>b>>c;

if(a<b+c && b<a+c && c<a+b)

{

if(a==b && b==c)

cout<<"triunghi echilateral";

else

if(a==b || a==c || b==c)

cout<<"triunghi isoscel";

else

if (a*a+b*b==c*c || b*b+c*c==a*a ||

a*a+c*c==b*b)

cout<<"triunghi dreptunghic";

else

cout<<"triunghi oarecare";

}

else

cout<<"nu pot forma laturile triunghiul";

return 0;

}

74 Culegere de algoritmi elementari la informatică



INFORMATICA

implementare C++

ISBN 978-973-0-36613-6

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!