0% au considerat acest document util (0 voturi)
416 vizualizări9 pagini

Algoritmi Elementarim

Documentul prezintă o serie de algoritmi elementari pentru prelucrarea numerelor întregi, cum ar fi: determinarea sumei, produsului și numărului de cifre ale unui număr; determinarea inversului, cifrei maxime/minime, cifrei de control etc. De asemenea, sunt prezentate algoritmi pentru determinarea celor mai mari divizori comuni, descompunerea în factori primi, șirul lui Fibonacci și altele.

Încărcat de

deo901
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)
416 vizualizări9 pagini

Algoritmi Elementarim

Documentul prezintă o serie de algoritmi elementari pentru prelucrarea numerelor întregi, cum ar fi: determinarea sumei, produsului și numărului de cifre ale unui număr; determinarea inversului, cifrei maxime/minime, cifrei de control etc. De asemenea, sunt prezentate algoritmi pentru determinarea celor mai mari divizori comuni, descompunerea în factori primi, șirul lui Fibonacci și altele.

Încărcat de

deo901
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/ 9

Algoritmi elementari

1. Spargerea unui numar in cifre

if (n == 0) prelucrare_caz_special()
while (n > 0)
{
cif = n%10;
..... //operatii care prelucreaza conform problemei cifra determinata
n = n / 10;
}
1. S se determine pentru un numr ntreg x cu cel mult 9 cifre citit de la tastatur:
a. suma cifrelor
b. produsul cifrelor
c. numrul cifrelor sale
a. calcularea sumei cifrelor
s=0;
while(n>0)
{
c=n%10;
s=s+c;
n=n/10;
}
b. calcularea numarului de cifre:

nrcifre = 0;
if (n == 0) nrcifre = 1;
while (n > 0)
{
nrcifre++;
n = n / 10;
}
b. determinarea primei cifre

if (n == 0) primacif = 0;
while (n > 9)
n=n / 10;
primacif = n;
c. determinarea oglinditului (de ex., oglinditul numarului 12345 este 54321)

ogl = 0;
while (n > 0)
{
cif = n % 10;
ogl = ogl * 10 + cif;
n = n / 10;
}
d. aflarea cifrei maxime sau minime din numar
Iniializm cmin=9, cmax=0 iar la fiecare pas actualizm cu:
if(cmin>n%10)cmin=n%10;
if(cmax<nn%10)cmax=n%10;
2. S se determine inversul unui numr ntreg x cu cel mult 9 cifre citit de la tastatur.
Exemplu. Pentru x=1234 se afieaz 4321
d. generarea cifrelor in ordinea in care apar in numar
p = 1;
while (p * 10 <= n)
p = p * 10;
while (n > 0)
{
cif = n / p;
//prelucreaza cifra cif;
n = n % p;
p = p / 10;
}
3. S se afieze pentru un numr ntreg x cu cel mult 9 cifre citit de la tastatur numrul
obinut prin eliminarea cifre de pe poziia k
a. Numrarea ncepe de la dreapta la stnga
b. Numrarea ncepe de la stnga la dreapta
e. numararea aparitiilor cifrei K

nrap = 0;
if (n == 0 && k == 0) nrap = 1;
while (n>0)
{
cif = n % 10;
if (cif == k)nrap++;
n = n / 10;
}
f. eliminarea cifrelor pare

p = 1; nr = 0;
while (n>0)
{
cif = n % 10;
if(cif % 2 != 0)
{
nr = nr + cif*p;
p = p * 10;
}
n = n / 10;
}
Se citeste un numar natural n. Sa se determine daca el are cifrele ordonate crescator sau
descrescator sau cifrele lui nu sunt ordonate.

#include<iostream>
using namespace std;
int main()
{
int n,c,d;
c=d=1;
cin>>n;
while(n>9)
{
if(n%10>=n/10%10) d=0;
if(n%10<=n/10%10) c=0;
n=n/10;
}
if(c==1) cout<<"crescator";
else if (d==1) cout<<"descrescator";
else cout<<"nici";
return 0;
}
Se citesc numere naturale pn cnd se introduce numrul 0. Afisati suma obtinut prin
adunarea primei si a ultimei cifre din fiecare numar citit. Numerele cu mai putin de 2 cifre nu
se iau in considerare. Exemplu: dac se introduc numerele 3455 66 7 8 23 11221 0 atunci se
va afisa 27 (3+5+6+6+2+3+1+1).

#include <iostream>
using namespace std;
int main()
{
int n,s=0;
cin>>n;
while(n!=0)
{
if(n>9) //daca numarul are cel putin doua cifre
{
s=s+n%10;//insumez ultima cifra
while(n>9)
n=n/10;//tai toate cifrele inafara de prima
s=s+n;//insumez prima cifra
}
cin>>n;
}
cout<<s;
return 0;
}
Se citeste un numar natural n cu cel mult 9 cifre. Sa se calculeze numarul obtinut din cifrele
lui pare aflate pe pozitii impare, numararea pozitiilor cifrelor incepand cu cifra cea mai
semnificativa.
Ex: daca n=2346561 rezulta 24

#include<iostream>
using namespace std;

int main()
{ long n,r=0;
cin>>n;
while(n)
{ r=r*10+n%10;
n=n/10;
}
while(r)
{ if(r%2==0) n=n*10+r%10;
r=r/100;
}
cout<<n;
}
S se determine pentru un numr ntreg x cu cel mult 9 cifre citit de la tastatur numrul
obinut din cifrele sale pare n ordinea n care acestea apar n numrul iniial.
Exemplu. pentru x=34567 se obine 46
4. Fie un numr natural x cu cel mult 4 cifre. S se insereze nainte de fiecare cifr par
urmtoarea cifr.
Exemplu. pentru x=5672 se obine 576732
5. Fie un numr natural x cu cel mult 4 cifre. S se dubleze apariia fiecrei cifre pare n
numrul x.
Exemplu. pentru x=5672 se obine 566722

- verificarea lui n daca are un numar impar de divizori (n este patrat perfect):
sqrt(n) == int(sqrt(n))
- verificarea lui n daca are 3 divizori:
sqrt(n) == int(sqrt(n)) si x=sqrt(n) numar prim (n este patrat perfect de numar prim)
2. Verificarea daca un numar este prim

if (n < 2) prim = 0;
else
{ prim = 1; //presupunem ca n este prim
for (d = 2; d * d <= n; d++)//d<=n/2
if (n % d == 0) {prim = 0; break;}
if (prim == 1) .... //operatiile de efectuat cand n este prim
}
3. cmmdc(a,b)

rest = a % b;
while (rest != 0)
{ a = b;
b = rest;
rest = a % b;}
cmmdc = b;
Atentie! Ca sa calculati cel mai mic multiplu comun, trebuie sa calculati cmmdc si sa
aplicati formula cmmmc=(ca*cb)/cmmdc; unde ca=a; cb=b; copiile valorilor initiale, facute
inainte de a calcula cmmdc
S se determine cel mai mare divizor comun a dou numere ntregi nenule x, y.
a. prin scderi repetate
b. prin mpriri repetate (algoritmul lui Euclid)
c. s se determine dac cele dou numere sunt prime ntre ele
S se determine cel mai mare divizor comun a 3 numere ntregi nenule x, y, z citite de la
tastatur.
4. Determinarea divizorilor proprii ai lui n

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


if (n % d==0) ... //operatii care trebuie efectuate cu divizorul propriu d
// s = s + d; face suma divizorilor
// nrd++; numara divizorii proprii
Dou numere x i y sunt prietene dac unul este egal cu suma divizorilor celuilalt. S se
determine dac dou numere naturale nenule cu cel mult 9 cifre fiecare sunt prietene.
Exemplu. pentru x=18 i y=39 se afieaz numere prietene deoarece suma divizorilor lui
x=18: 1+2+3+6+9+18=39.
5. Numarul de numere din intervalul [a,b], divizibile cu k (k>0)
Numarul de numere <=n divizibile cu k = n/k
Numarul de numere din [a,b], divizibile cu k = b/k (a-1)/k
Numarul de multipli de a si multipli de b din [1,n] = n/cmmmc(a,b)
Numarul de multipli de a care nu sunt multipli de b din [1,n] = n/a-n/cmmmc(a,b)
S se afieze numerele prime din intervalul [a,b] unde a i b sunt numere naturale cu cel mult
4 cifre citite de la tastatur.
6. Descompunerea in factori primi. Determinarea divizorilor primi ai lui n.

d = 2;
while (d * d <= n)
{
m = 0;
while ( n % d == 0)
{ m++; n = n / d;}
if (m>0) ... //operatii care trebuie efectuate cu divizorul prim d la puterea m
d++;
}
if (n>1) prelucreaza ultimul divizor prim n, care apare la puterea 1
S se determine suma exponenilor factorilor care intervin la descompunerea n factori primi
a numrului x natural cu cel mult nou cifre. Pe baza rezultatului determinai dac numrul x
este numr prim.
Exemplu. pentru x=9800 (23 * 52* 72) se afieaz 7 (3+2+2). Nu este numr prim. Pentru
x=23 se afieaz 1. Este numr prim.

7. Cel mai mare numar fibonacci mai mic sau egal cu n

fin>>n;
f0 = f1 = 1;
while (f0+f1 <= n)
{
f2 = f0 + f1;
f0 = f1;
f1 = f2;
}
Prelucreaza f1
Se citesc doua numere naturale a si b (ambele mai mari decat 1). Calculati si afisati cati
termeni din sirul lui Fibonacci se afla in intervalul [a,b].
Exemplu: In intervalul [20,40] sunt 2 termeni (21 si 34)
#include <iostream>
using namespace std;

int main()
{
int a,b,k=0,x,y,z;
cin>>a>>b;
x=y=1;
while(x+y<=b)
{
z=x+y;
if(z>=a) k++;
x=y;
y=z;
}
cout<<k;
return 0;
}
S se afieze primii n termeni din irul lui Fibonacci, unde n este numr natural citit de la
tastatur.
8. Cifra de control a lui n

if (n == 0) cifc = 0;
else
if (n % 9 == 0) cifc = 9;
else cifc = n % 9;
S se afieze pentru un numr ntreg x cu cel mult 9 cifre citit de la tastatur cifra de control
(cifra care se obine adunnd cifrele numrului pn se obine o singur cifr).
Exemplu. pentru x=55566577 se obin sumele 46, apoi 10, apoi 1. Cifra de control este 1.

9.. Ultima cifra a lui x la puterea y (x, y numere naturale, x>0)

c = x % 10;
if (y % 4 == 1) ucif = c;
else if (y % 4 == 2) ucif = (c*c)%10;
else if (y % 4 == 3) ucif = (c*c*c)%10;
else if (y % 4 == 0) ucif = (c*c*c*c)%10;
10. Citirea pe rand a n numere

fin>>n;
for (i=1; i<=n; i++)
{
fin>>a;
.... //operatii care prelucreaza a cu oricare dintre ceilalti algoritmi
}
Prelucrarea unui sir de n numere
Pentru n (n100) numere ntregi citite de la tastatur s se determine:
a. Suma valorilor pare
b. Ultima cifr a produsului valorilor impare
c. Media aritmetica a numerelor citite
Se citeste un numar natural n si apoi n numere naturale. Afisati cate dintre numerele citite au
rasturnatul egal cu primul numar citit. Ex: se citesc n= 7 si numerele 231 78 132 30 132 8
132 se va afisa 3

int main()
{
int i,n,x,y,k=0,r;
cin>>n;
cin>>x;
for(i=1;i<n;i++)
{
cin>>y;
r=0;
while(y>0) {r=r*10+y%10; y=y/10;}
if(r==x) k++;
}
cout<<k;
return 0;
}
11. Citirea pe rand a n numere si prelucrarea perechilor de numere citite consecutiv
(primul cu al doilea, al doilea cu al treilea, al treilea cu al patrulea, etc.)

fin>>n;
fin>>a;
for (i=2; i<=n; i++)
{ fin>>b;
.... //operatii care prelucreaza perechea formata din a si b
a=b;
}
12. Citirea pe rand a n numere si determinarea minimului / maximului acestora

fin>>n;
fin>>a;
min=a; //presupunem ca minimul este primul element
for (i=2; i<=n; i++)
{
fin>>a;
if (min<a) min=a; //pentru maximul a n numere, in loc de (min<a) va fi (max>b)
}
Pentru n (n100) numere ntregi x cu cel mult 4 cifre fiecare citite de la tastatur s se
determine:
a. valoarea minim citit
b. valoarea maxim citit i de cte ori apare aceast valoare n irul valorilor citite
c. cel mai mare numr par
d. valoarea x cu cea mai mare sum a cifrelor. Dac sunt mai multe astfel de numere
(cu aceeai sum a cifrelor) se va afia cel cu valoarea cea mai mic.
13. Parcurgerea numerelor dintr-un interval [a,b]
#include<iostream>

using namespace std;

int main()
{
int a, b, i, ok, d;
cin>>a>>b;
for(i=a;i<=b;i++)
{
ok=1;
if(i==0 || i==1) ok=0;
else for(d=2;d<=i/2;d++)
if(i%d==0) ok=0;
if(ok) cout<<i<<" ";
}
return 0;
}
Se citesc doua numere naturale a si b. Calculati cate numere palindrom sunt din intervalul
[a,b]. Un numar este palindrom daca are aceeasi valoare atat daca e citit de la stanga la
dreapta cat si de la dreapta la stanga (de exemplu 12321).

#include <iostream>
using namespace std;

int main()
{
int a,b,k=0;
cout<<"a="; cin>>a;
cout<<"b="; cin>>b;
for(int x=a;x<=b;x++)
{
int y=x;
int r=0;
while(y>0)
{
r=r*10+y%10;
y=y/10;
}
if(x==r)
{
cout<<x<<" ";
k++;
}
}
cout<<"sunt "<<k<<" palindroame in intervalul ["<<a<<","<<b<<"]";
return 0;
}

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