25 dec. 2011

Cel mai mic multiplu comun

O varianta simpla pentru problema celui mai mic multiplu comun.

#include <iostream>

using namespace std;

int main() {
 int a, b, divizor, putereA, putereB, rezultat = 1;

 cin >> a;

 cin >> b;

 int maxDiv = a / 2;
 int sqrtB = b / 2;

 if (maxDiv < sqrtB) {
  maxDiv = sqrtB;
 }

 for (divizor = 2; divizor <= maxDiv; divizor++) {
  if (a % divizor == 0 && b % divizor == 0) {
   putereA = 0;
   putereB = 0;
   while (a % divizor == 0) {
    a = a / divizor;
    putereA++;
   }

   while (b % divizor == 0) {
    b = b / divizor;
    putereB++;
   }
   if (putereA > putereB) {
    while (putereA > 0) {
     rezultat = rezultat * divizor;
     putereA--;
    }
   } else {
    while (putereB > 0) {
     rezultat = rezultat * divizor;
     putereB--;
    }
   }
  } else {
   if (a % divizor == 0) {
    while (a % divizor == 0) {
     a = a / divizor;
     rezultat = rezultat * divizor;
    }
   } else {
    if (b % divizor == 0) {
     while (b % divizor == 0) {
      b = b / divizor;
      rezultat = rezultat * divizor;
     }
    }
   }
  }
 }
 cout << "rez=" << rezultat;
 return 0;
}

O versiune mai rafinata a programului de mai sus
#include <iostream>

using namespace std;

void getDiv(int &a, int d, int &r) {
 r = 0;
 while (!(a % d)) {
  a = a / d;
  r++;
 }
}

void addRez(int &rez, int &a, int d) {
 while (!(a % d)) {
  a = a / d;
  rez = rez * d;
 }
}

int main() {
 int a, b, divizor, putereA, putereB, rezultat = 1;

 cin >> a;
 cin >> b;

 int maxDiv = a > b ? a : b;
 maxDiv /= 2;

 for (divizor = 2; divizor <= maxDiv; divizor++) {
  if (a % divizor || b % divizor) {
   getDiv(a, divizor, putereA);
   getDiv(b, divizor, putereB);

   if (putereA > putereB) {
    while (putereA) {
     rezultat = rezultat * divizor;
     putereA--;
    }
   } else {
    while (putereB) {
     rezultat = rezultat * divizor;
     putereB--;
    }
   }
  } else {
   if (!(a % divizor)) {
    addRez(rezultat, a, divizor);
   } else {
    if (!(b % divizor)) {
     addRez(rezultat, b, divizor);
    }
   }
  }
 }
 cout << "rez= " << rezultat;
 return 0;
}
propuneri de enunturi

Niciun comentariu:

Trimiteți un comentariu