Algorimi Elementari
Algorimi Elementari
#include<iostream>
b) citeste a,b; using namespace std;
a a-b; int main()
b a+b; {int a,b;
a b-a; cin>>a>>b;
scrie a,b a=a-b;
b=a+b;
a=b-a;
cout<<a<<b;
return 0;}
1
//a)
#include<iostream>
using namespace std;
2. Algoritmi pentru determinarea valorii maxime/minime int main()
a) pentru doua numere {int a,b,max;
cin>>a>>b;
citeste a, b; if (a>b){
daca (a>b) atunci max a max=a ;}
altfel max b; else{ max=b ;}
cout<<max;
scrie max return 0;}
//b)
b) pentru trei numere #include<iostream>
using namespace std;
citeste a, b,c; int main()
daca (a>b) {int a,b,c,max;
daca (c>a) cin>>a>>b>>c;
atunci max c if (a>b)
altfel max a; if(c>a){
{max=c ;}
altfel else{ max=a ;}}
daca (c>b) else {
atunci max c if(c>b)
altfel max b; {max=c ;}
else{ max=b ;}}
cout<<max;
return 0;}
c) pentru n numere
//c)
#include<iostream>
using namespace std;
int main()
{
int a[50],n,i,max;
cin>>n;
for (i=1; i<=n; i++)
d) sir de numere citite de la tastatura pana la intalnirea valorii 0 {cin>>a[i];}
max=a[1];
//d) for (i=1; i<=n; i++)
#include<iostream> {if (max<a[i])
using namespace std; max=a[i]; }
int main() cout<<max;
{int a[50],n,i,max; return 0;}
do{cin>>n;
for (i=1; i<=n; i++)
{ cin>>a[i]; }
max=a[1];
for (i=1; i<=n; i++)
{ if (max<a[i])
max=a[i];}
}while(a[i]!=0);
cout<<max; 2
return 0;}
//a)
#include<iostream>
using namespace std;
int main()
3. Algoritm pentru prelucrarea cifrelor {
unsigned int n;
citeste n;
cin>>n;
cat timp (n≠0) executa
while(n!=0)
c n mod 10; {
prelucreaza c; cout<<n%10<<" ";
n n div 10 ; n=n/10;}
return 0;}
a. Se da un numar natural. Sa se afiseze cifrele sale:
//b)
citeste n;
#include<iostream>
cat timp (n≠0) executa
using namespace std;
c n mod 10;
int main()
prelucreaza c;
{
n n div 10 ;
unsigned int n,s=0;
cin>>n;
while(n!=0)
b. Sa da un numar natural. Sa se scrie suma cifrelor: {s=s+n%10;
n=n/10;}
citeste n; cout<<s;
s=0; return 0;}
cat timp (n≠0) executa
s s + n mod 10; //c)
prelucreaza s; #include<iostream>
n n div 10 ; using namespace std;
int main()
scrie s ; {
c. Sa da un numar natural. Sa se precizeze din cate cifre este alcatuit: unsigned int n,c;
cin>>n;
citeste n; while(n!=0)
c=0; {c++;
cat timp (n≠0) executa n=n/10;}
c c + 1; cout<<c;
prelucreaza c; return 0;}
n n div 10 ;
//d)
scrie c ; #include<iostream>
using namespace std;
d. Sa da un numar natural. Sa se afiseze suma cifrelor pare. int main()
{
citeste n; unsigned int n,s=0;
s=0; cin>>n;
cat timp (n≠0) executa while(n!=0)
daca((n mod 10) mod 2 = 0) {if(n%10%2 == 0)
s s + n mod 10; s=s+n%10;
prelucreaza s; n=n/10;
n n div 10 ; }
scrie s ; cout<<s;
return 0;}
3
//e)
#include<iostream>
using namespace std;
int main()
e. Sa da un numar natural. Sa se determine cifra maxima {
unsigned int n,max=0;
citeste n; cin>>n;
max=0; while(n!=0)
cat timp (n≠0) executa {if(max < (n%10))
daca(max < (n mod 10)) max=n%10;
max n mod 10; n=n/10;}
cout<<max;
prelucreaza max;
return 0;}
n n div 10 ;
scrie max ;
//f)
f. Sa da un numar natural . Sa se determine inversul #include<iostream>
using namespace std;
citeste n; int main()
c=0; {unsigned int n,c=0;
cat timp (n≠0) executa cin>>n;
c c*10 + n mod 10; while(n!=0)
prelucreaza max; {c=c*10+n%10;
n n div 10 ; n=n/10;}
scrie max ; cout<<c;
return 0;}
4
h. Sa da un numar natural . Sa se verifice daca numarul contine cel putin o cifra para.
//h)
citeste n;
#include<iostream>
cat timp (n≠0 si c=0) executa
using namespace std;
daca((n mod 10) mod 2 = 0) int main()
c 1; {
prelucreaza c; unsigned int n,c=1;
n n div 10 ; cin>>n;
daca(c=1) while((n!=0) && !c)
scrie "da"; {if (n%10%2 == 0)
altfel c=1;
scrie "nu"; n=n/10;}
if(c==1)
cout<<"da";
else{cout<<"nu";}
return 0;}
//l)
#include <iostream>
using namespace std;
int main()
{ int a,b,i,c=1;
cin>>a;
cin>>b;
for(i=1;i<=b;i++)
c=c*a;
cout<<c%10;
return 0;
}
6
//4.I)
#include <iostream>
using namespace std;
4. Algoritm pentru aflarea c.m.m.d.c. int main(){
int a,b;
cin>>a;
I) citeste a, b; cin>>b;
cat timp (a≠b) executa while (a !=b){
if (a > b)
daca (a>b) atunci a a-b
a = a - b;
altfel b b-a;
else
//4.II) b = b - a;
#include <iostream> }
Scrie a using namespace std; }
int main(){ cout<<a;
II) citeste a,b; int a,b,r; return 0;}
r a%b; cin>>a;
cat timp (r≠0) executa cin>>b;
ab; r=a%b;
br; while (r !=0){
r a%b; a=b;
b=r;
Scrie b r=a%b;
}
}
cout<<b;
return 0;}
a. Se citesc n numere. Sa se determine cel mai mare divizor comun dintre cele n numere.
citeste n;
d 2;
pentru i 1,n,1 executa
citeste a[i];
//4.a)
cmmdc a[1];
#include <iostream>
pentru i 2,n,1 executa
using namespace std;
c a[i]; int main(){
cat timp (c≠cmmdc) executa int n,i,c,cmmdc,a[100];
daca (c>cmmdc) cin>>n;
c c-cmmdc; for (i=1;i<=n;i++)
altfel daca (c<cmmdc) cin>>a[i];
cmmdc cmmdc-c; cmmdc = a[1];
for (i=2; i<=n;i++){
c = a[i];
while (c != cmmdc){
scrie cmmdc; if (c > cmmdc)
c = c - cmmdc;
else if (c < cmmdc)
cmmdc = cmmdc - c;
}
}
cout<<cmmdc;
return 0;}
7
//5.
#include<iostream>
using namespace std;
5. Algoritm pentru verificarea daca un numar este prim int main()
citeste n; {
c=0; int n,c=0;
cin>>n;
pentru i 1,n,1 executa
for (int i=1; i<=n; i++)
daca(n mod i = 0)
{
cc+1;
if (n%i==0)
c++;
}
daca(c=2) if (c==2)
scrie "prim"; cout<<"prim";
altfel else
scrie "nu este prim"; cout<<"nu este prim";
return 0;}
//6.
6. Algoritm pentru descompunerea in factori primi a unui numar n
#include <iostream>
using namespace std;
citeste n; int main()
d 2; {
cat timp (n>1) executa int n,d=2,k;
k=0; cout<<"Introduceti numarul n:
cat timp (n%d=0) executa ";
cin>>n;
k k+1;
while(n>1)
n n div 10 ;
{
k=0;
daca (k>0)
while(n%d==0)
scrie d “^” k;
{
k++;
d d+1;
n=n/d;
}
if(k>0)
cout<<d<<"^"<<k<<" ";
d=d+1;
}
return 0;}
8
Definiţia secvenţei: Prin secvenţă a unui şir dat se înţelege o succesiune de unul sau mai mulţi
termeni din şir aflaţi pe poziţii consecutive. De exemplu, pentru şirul dat (2,5,6,8,12,14,23,31), o
secvenţă a acestuia este subşirul (8,12,14,23). Facem precizarea că şirul dat este o secvenţă a lui
însuşi. Deci dacă şirul dat este o secvenţă, atunci orice subşir al acestuia care are termenii situaţi pe
poziţii consecutive se numeşte subsecvenţă.
Secvență crescătoare Dată o secvență cu n numere naturale, să se spună dacă cele n numere din
secvență sunt în ordine crescătoare (fiecare număr este mai mic sau egal cu cel de după el).
Numerele naturale sunt mai mici sau egale cu 2000000000.
Explicație 5 2 5 7 9 10 DA Secvenţa citită este o secvenţă crescătoare.
9 3 7 9 23 5 8 31 123 55 NU Secvenţa citită nu este o secvenţă crescătoare.
#include <fstream>
using namespace std;
ifstream fin("crescatoare.in");
ofstream fout("crescatoare.out");
int n,i,a,b,cresc;
int main()
{
fin>>n;
fin>>a;
cresc = 1;
i = 1;
while (i< n && cresc == 1){
fin>>b;
if (b<a) cresc = 0;
else {
a = b;
i++;
}
}
if (cresc == 1) fout<<"DA";
else fout<<"NU";
fin.close();
fout.close();
return 0;
}
9
1 a=b, caz în care creşte lungimea secvenţei curente (lc=lc+1) şi o comparăm cu lmax, iar
dacă lc>lmax, actualizăm lmax cu lc (lmax=lc).
2 a!=b, în acest caz iniţializăm a cu b (a=b) si lc cu 1 (lc=1).
pas3. În ambele situaţii incrementăm variabila i cu 1 (i=i+1) şi reluăm pas1. După ce au fost citite
toate numerele, se afişează lungimea secvenţei maxime.
#include <fstream>
using namespace std;
ifstream fin("platou.in");
ofstream fout("platou.out");
int n,i,a,b,lc,lmax;
int main()
{
fin>>n;
fin>>a;
lmax = 1;
lc = 1;
for ( i = 1; i < n; i++ ){
fin>>b;
if ( b == a ) {
lc++;
if ( lc > lmax ) lmax = lc;
}
else {
a = b;
lc = 1;
}
}
fout<<lmax;
fin.close();
fout.close();
return 0;
}
10
Metoda I: se generează toate subșirurile posibile și dintre acestea se reține acela care are elementele
distincte de lungimea maximă. Complexitate O(n3).
Metoda II:
- poz[i] retine pozitia in care a aparut ultima oara elementul v[i]
- lung – lungimea actuala a unei secvente formata din elemente distincte
- lmax – lungimea maxima a unei secvente formata din elemente distincte
citeste n
pentru i 1, n executa citeste v[i]
pentru i 1, val_max executa poz[i] 0 //pana acum nu apare niciun
element sf. pentru
lunglmax1 //initial prima valoare din vector, ne da
secventa cea mai lunga
poz[v[1]] 1 //prima valoare apare pe pozitia 1
pentru i 2, n executa //pentru celelalte elemente
anterior poz[v[i]] //retinem pozitia anterioara pe care a
aparut elem curent
daca anterior = 0 sau i – lung ≥ anterior atunci //daca nu a aparut sau
secvscurta
lung lung + 1 //retinrm numarul de elemente din secventa
altfel
daca lung > lmax atunci //verificam daca avem o secventa maxima
lmax lung
lung i – anterior //retinem lungimea secventei
actuale
poz[v[i]] i //retinem pozitia in care apare elementul v[i]
daca lung > lmax atunci //pentru ultima secventa trebuie sa verificam
daca e maxima
lmax lung
scrie lmax
2. Se dă un şir de numere naturale S[] = (s1, s2, .., sN) de lungime n. Să se se stabilească ce element
se găsește pe poziția k, dacă șirul ar fi sortat.
Date de intrare: fișierul secventa2.in conține pe prima linie două valori naturale n și k(k ≤ n), iar pe a
doua linie n numere naturale separate printr-un spațiu. (1 ≤ n ≤ 10 000, 1 ≤ si ≤ 109)
Date de ieșire: fișierul secvența2.out conține un număr natural reprezentând care este elementul
situat pe poziția k, dacă șirul ar fi sortat.
Exemplu:
10 4
1245671256 rezultat 2 șirul sortat: 1 1 2 2 4 5 5 6 6 7
12 10
12 11 10 9 8 7 6 5 4 3 2 1 rezultat 10
11
mid s[(r + w) / 2] //retinem elemental din mijloc = pivot
cat timp r < w executa {
daca s[r] >= mid atunci // daca in stanga e o valoare mai
mare
aux s[w] // o punem la sfarsit
s[w] s[r];
s[r] aux
w w – 1 //trecem la urmatoarea valoare din
dreapta
altfel // daca e o valoare mai mica decat pivotul
r r + 1 //trecem la urmatoarea valoare in stanga
daca s[r] > mid atunci// daca cu r r+1 am depasit pivotul
r r – 1 //ne deplasam o pozitie la stanga
daca k <= r atunci //daca r a ajuns la pozitia k
to r; //modificam marginea din dreapta
altfel //in caz contrar
from r + 1 //modificam marginea din stanga
scrie s[k];
12
7. Se da o secventa de n nr. Sa se afiseze care este numarul maxim de numere identice din secventa.
//9.
#include<iostream>
using namespace std;
int main()
{
9. Algoritm pentru generarea primilor n termini ai sirului lui Fibonacciunsigned int n,i,f,a,b;
citeste n; cin>>n;
a 1; v[1]=0;
b 1; v[2]=1;
Scrie a, b; cout<<v[1]<<" "<<v[2]<<endl;
pentru i 2 la n executa for(i=2;i<n;i++){
f a+b f=a+b;
Scrie f; cout<<f;
ab a=b;
bf b=f;
}
return
a. Se da un numar n. sa se afiseze cel mai mare numar Fibonacci mai mic sau egal cu n0;}
13
//9.a)
#include<iostream>
using namespace std;
int main()
{
unsigned int
n,i,v[200],t[200],k,max;
cin>>n;
//baza 10 in baza b
v[1]=0;
8. Conversia din baza 10 in baza b #include <iostream>
v[2]=1;
using namespace std;
citeşte n cout<<v[1]<<" "<<v[2]<<endl;
int main()
citeste b for(i=2;i<n;i++){
{
m=0 v[i]=v[1]+v[2];
int n,b,m=0,k=1,r;
k=1 cout<<v[i]<<" ";
cin>>n;
cât timp (n≠0) execută v[1]=v[2];
cin>>b;
r = n mod b; v[2]=v[i];
while(n!=0){
m = m+r*k; }
r=n%b;
k = k*10; cout<<endl;
m=m+r*k;
k=0;
n = n div b; k=k*10;
for (i=1; i<=n; i++)
n=n/b;
{
scrie m; }
if (v[i]<=n){
cout <<m;
k++;
return 0;}
t[k]=v[i];
}
Conversia din baza b in baza 10 //baza b in baza 10 }
#include <iostream> for (i=1;i<=k;i++)
citeşte n,b using namespace std; {
k=1 int main() cout<<t[i]<<" ";
m=0 { }
cât timp (n≠0) execută int n,b,m=0,k=1,c; max=t[1];
c = n mod 10 cin>>n; for (i=1; i<=k; i++)
m = m+c*k cin>>b; {
k = k*b while(n!=0){ if (max<t[i])
n = n div 10 c=n%10; max=t[i];
m=m+c*k; }
scrie m k=k*b; cout<<endl;
n=n/10; cout<<"Maximul este:"<<max;
} return 0;}
cout <<m;
return 0;}
14