Sunteți pe pagina 1din 6

Descompunere n factori primi

Se citete un numr n. S se descompun n factori primi.


Exemple: dac n = 12 vom afia 12 = 2^2 * 3; dac n = 504 vom
afia 504 = 2^3 * 3^2 * 7. Not de rezolvare: nu este nevoie s
testm dac un divizor este prim, putem testa toi divizorii. Numai
cei primi vor ajunge s divid n.

#include <iostream>
int n, p, d;
int main() {
cout<<"n = ";
cin>>n;
d = 2;
while ( n > 1 ) {
p = 0;
while ( n % d == 0 ) {
p = p + 1;
n = n / d;
}
if ( p > 0 )
cout<< d <<"^"<< p ;
d = d + 1;
}
cout<<endl;
}

Descompunere n factori primi

Puterea lui k n n!
Se citesc numerele n i k, k numr prim, k n. Considerm numrul n! =
123...n. S se afieze puterea lui k din descompunerea n factori primi a
lui n!.

#include <stdio.h>
int main() {
int n, k, p, f, fc;
scanf( "%d%d", &n, &k );
p = 0;
f = 2;
while ( f <= n ) {
fc = f;
while ( fc % k == 0 ) {
p = p + 1;
fc = fc / k;
}
f = f + 1;
}
printf( "%d", p );
return 0;
Puterea lui k n n!

Algoritmul lui Euclid (cmmdc a dou numere)


Algoritmul lui Euclid este o metod eficient de calcul al celui mai mare divizor comun ( CMMDC). El este denumit dup
matematicianul grec Euclid, care l-a inventat. Un avantaj important al algoritmului lui Euclid este c el poate
gsi CMMDC eficient fr s trebuiasc s calculeze factorii primi ai numerelor.
Euclid a observat c CMMDC al dou numere a i b rmne acelai dac se scade numrul mai mic din cel mai mare
(demonstrai!). Presupunnd c a este numrul mai mare, scznd n mod repetat pe b dina, n a va rmne restul
mpririi lui a la b. Rezult c CMMDC(a, b) este totuna cu CMMDC(b, a % b). Algoritmul care rezult este
urmtorul: lum restul mpririi lui a la b, apoi restul mpririi lui b la rest, i aa mai departe, pn ce obinem un rest
zero. CMMDC este numrul rmas, cel diferit de zero.

Exemplu
S calculm CMMDC(252, 105). Calculm 252 % 105 = 42. De aceea va
trebui s calculm CMMDC(105, 42). n continuare calculm 105 % 42 = 21.
Deci, vom calcula CMMDC(42, 21). Calculm 42 % 21 = 0. Deoarece restul
este zero CMMDC va fi ultimul numr nenul, adica 21.

Schema logic i programul


Iat algoritmul scris ca schem logic i implementarea sa n limbajul C:

#include <stdio.h>

int main() {
int a, b, r;
scanf( "%d%d", &a, &b );
while ( b > 0 ) {
r = a % b;
a = b;
b = r;
}
printf( "%d", a );
return 0;
}
CMMDC cu algoritmul lui Euclid

Not: remarcai c nu este nevoie s interschimbm variabilele dac a este iniial mai mic ca b. Dup prima execuie
a buclei while ele se vor interschimba n mod natural.

Exerciiu
Doi prieteni, un iepure i o broscu joac un joc: pornesc de la o linie de start i ncep s sar. Broasca
sare n centimetri, iar iepurele m centimetri. Cine este mai n spate vine la rnd s sar. Jocul se termin atunci cnd
iepurele i broasca snt iari la egalitate. Ci centimetri au parcurs cei doi prieteni?

Sriturile broscuei i iepurelui

Rspuns: dup cum se vede i din figur, broscua i iepurele vor sri o lungime egal cu CMMMC(m, n).
CMMMC(m, n) = m n / CMMDC(m, n)

Tem

Pavaj: s se paveze un dreptunghi cu ptrate maximale. Se citesc a i b numere naturale,

dimensiunile laturilor dreptunghiului, s se afieze latura ptratelor cele mai mari cu care putem acoperi
dreptunghiul, precum i numrul lor. Exemple: dac a este 3 i b este 4 vom afia 1 i 12 (cel mai mare
ptrat cu care putem acoperi dreptunghiul are latur 1 i avem nevoie de 12 astfel de ptrate);
dac a este 6 i b este 8 vom afia 2 i 12; dac a este 12 i b este 20 vom afia 4 i 15.
#include <iostream>
using namespace std;
int main() {
int a, b, r;
float nr,nr1;
cin>>a>>b;
nr=a*b;
while ( b > 0 ) {
r = a % b;
a = b;
b = r;
}
nr1=nr/a/a;
cout<<a<<"

"<<nr1;

return 0;
}
Cifr: se citete un numr n, s se spun dac este format dintr-o singur cifr, repetat.

Exemple: 3333 este un astfel de numr, 2424 nu este, 5 este, 88 este.


#include <iostream>

using namespace std;

int main()

{
int x;
bool egale;
cout<<"Dati valoarea lui x= ";cin>>x;
int x1=x;
egale=true; // pp ca cifrele numarului x sunt egale
while((x1>=10)&&(egale!=false))
{
if(x1%10!=(x1/10)%10)egale=false;
x1=x1/10;
}
if(egale==true)cout<<"DA !";
else cout<<"NU !";

return 0;
}

Ordonare: se citesc patru numere, a, b, c i d. S se afieze n ordine cresctoare. Folosii

interschimbri de variabile, precum ai vzut mai sus, n lec ie.


#include <iostream>
using namespace std;

int main() {
int a, b, c, d,aux;

cin>>a>>b>>c>>d;
if ( a > b ) {

aux = a;
a = b;
b = aux;
}
if ( b > c ) {
aux = b;
b = c;
c = aux;
}
if ( c > d ) {
aux = c;
c = d;
d = aux;
}
if ( a > b ) {
aux = a;
a = b;
b = aux;
}
if ( b > c ) {
aux = b;
b = c;
c = aux;
}
cout<<a<<" "<<b<<"

"<<c<<"

"<<d;

return 0;
}
Problem de logic: un rege ar fi trebuit s primeasc zece fiicuri (ce este acela un fi ic?) de monede a cte zece
grame fiecare moned. Din nefericire unul din fiicuri con ine zece monede a cte 9 grame fiecare moned, n loc
de zece. Dispunem de un cntar cu eroare mai mic de un gram i avem voie s facem o singur cntrire. Cum
vom proceda pentru a descoperi fiicul cu monede mai u oare?