0% au considerat acest document util (0 voturi)
170 vizualizări14 pagini

Algorimi Elementari

Documentul prezintă algoritmi pentru rezolvarea unor probleme matematice: interschimbarea a două numere, determinarea valorii maxime/minime din mai multe numere, prelucrarea cifrelor unui număr (afișarea, suma, numărul de cifre). Sunt date exemple de cod C++ pentru fiecare problemă.

Încărcat de

SabinSirbu
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
170 vizualizări14 pagini

Algorimi Elementari

Documentul prezintă algoritmi pentru rezolvarea unor probleme matematice: interschimbarea a două numere, determinarea valorii maxime/minime din mai multe numere, prelucrarea cifrelor unui număr (afișarea, suma, numărul de cifre). Sunt date exemple de cod C++ pentru fiecare problemă.

Încărcat de

SabinSirbu
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 14

1.

Algoritm pentru interschimbarea a doua numere

a) citeste a,b; #include<iostream>


aux  a; using namespace std;
int main()
a  b;
{int a,b,aux;
b  aux ;
cin>>a>>b;
scrie a,b;
aux=a;
a=b;
b=aux;
cout<<a<<b;
return 0;}

#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;}

g. Sa da un numar natural. Sa se verifice daca are toate cifrele pare //g)


#include<iostream>
citeste n; using namespace std;
c=1; int main()
cat timp (n≠0 si c=1) executa {
daca((n mod 10) mod 2 = 1) unsigned int n,c=1;
c  0; cin>>n;
prelucreaza c; while((n!=0) && c)
{if (n%10%2 == 1)
n  n div 10 ;
c=0;
daca(c=1)
n=n/10;}
scrie "da";
if(c==1)
altfel
cout<<"da";
scrie "nu"; else
cout<<"nu";
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;}

i. Sa da un numar natural. Sa se construiasca un nou numar cu cifrele pare.


//i)
citeste n;
#include<iostream>
c=0;
using namespace std;
cat timp (n≠0) executa
int main()
daca((n mod 10) mod 2 = 0)
{
c  c*10+n mod 10;
unsigned int n,c=0;
prelucreaza c; cin>>n;
n  n div 10 ; while(n!=0)
{if (n%10%2 == 0)
n=0; c=c*10+n%10;
cat timp (c≠0) executa n=n/10;}
n  n*10+c mod 10; n=0;
prelucreaza n; while(c!=0)
c  c div 10 ; {n=n*10+c%10;
c=c/10;}
scrie n ; cout<<n;
return 0;}
j. Sa da un numar natural Sa se afle cifra de control
//j)
citeste n; #include<iostream>
cat timp (n>9) executa using namespace std;
s=0; int main()
cat timp (n≠0) executa {
s  s+n mod 10; unsigned int n,s;
prelucreaza s; cin>>n;
n  n div 10 ; while(n>9){
s=0;
n=s; while(n!=0)
{
scrie s ; s=s+n%10;
n=n/10;}
n=s;}
5
cout<<s;
return 0;}
//k)
#include <iostream>
using namespace std;
int main()
{
int i,c=0,n,m;
k. Sa da un numar natural. Sa se verifice daca are cifre distincte. cout<<"a=";
cin>>a;
for (i=0;i<10;i++)
l. Sa se determine ultima cifra a lui XY {
citeste a; b=a;
citeste b; while(b!=0) {
c=1; if (b%10==i) {
pentru i  1,b,1 executa c++;
cc*a; break;
prelucreaza c; }
n  n div 10 ; b=b/10;
}
scrie c mod 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;
ab; r=a%b;
br; 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)
{
cc+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;
}

Secvenţă platou Se dă o secvență de n numere naturale. Să se găsească subsecvenţa de lungime


maximă ce are toate numerele egale.
Numerele naturale sunt mai mici sau egale cu 2000000000.
Exemplu : 14 3 4 4 4 4 4 7 7 5 6 6 9 9 9 5
Secvenţa cu cele mai multe numere egale este 4 4 4 4 4 şi are 5 numere.

pas1. Se citeşte n, numărul de numere.


Citim primul număr în variabila a şi iniţializăm lungimea secvenţei curente (secvenţa ce
începe cu numărul citit în variabila a) cu 1 şi lungimea secvenţei maxime cu 1
(lc=1,lmax=1).
pas2. Cât timp mai există numere necitite (i<n), citim un nou număr în variabila b. Comparăm a cu
b. Avem două situaţii:

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;
}

Prelucrarea secvențelor în mod optim


1. Se dă un şir de numere naturale S[] = (s1, s2, .., sN) de lungime N.
O subsecvenţă a şirului este de forma: (si, si+1, ..., sj) cu 1 ≤ i ≤ j ≤ N.
Lungimea secvenței este j-i+1.
Cerință: Să se determine cea mai lungă subsecvență formată numai din valori distincte.
Date de intrare: fișierul secventa1.in conține pe prima linie o valoare naturală N, iar pe a doua linie
N numere naturale separate printr-un spațiu.
Date de ieșire: fișierul secvența1.out conține un număr natural reprezentând lungimea celei mai
lungi subsecvențe formată numai din valori distincte.
Exemplu:
10
12456712566 cea mai lungă subsecvență are lungimea 6 (124567 sau 245671 sau
456712)
6
222222 cea mai lungă subsecvență are lungimea 1
Rezolvare:

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
lunglmax1 //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

Rezolvare: Există un algoritm care determină în mod liniar elementul: ……………


//citiri
from  1, to n; //limitele secventei // daca am ajuns la from =
to am gasit al k-lea element
cat timp from < to executa
r  from
w  to

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.

8. Algoritm pentru afisarea divizorilor unui numar n


//8.
#include <iostream>
citeste n; using namespace std;
pentru i  2 la (n div 2) executa int main()
{
daca((n mod i) = 0)
int n,i;
scrie i;
cin >> n;
for(int i=2;i<=n/2;i++)
{
if(n%i == 0)
cout <<i<< " ";
}
return 0;}

//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;
ab a=b;
bf 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

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