Se afișează postările cu eticheta functii. Afișați toate postările
Se afișează postările cu eticheta functii. Afișați toate postările

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

21 dec. 2011

editare char array

Se citeste de la tastatura un sir s, de lungime cel mult 80 de caractere. Numim umbra sirului s, sirul obtinut prin urmatoarele operatii asupra sirului s:
  1. transformarea tuturor literelor mari in litere mici si invers
  2. dublarea caracterului punct
  3. inlocuirea tuturor celorlalte caractere speciale cu caracterul '#'
  4. eliminarea tuturor cifrelor

#include <iostream>

using namespace std;

char str[100];

void replaceLetter(int i) {
 str[i] += (str[i] > 96) ? (-32) : 32;
}

void addPct(int i) {
 for (int j = 99; j > i; j--) {
  str[j] = str[j - 1];
 }
}

void removeDigit(int i) {
 for (int j = i; j < 99; j++) {
  str[j] = str[j + 1];
 }
}

int main() {
 //ab23Am.,t5F:-Ku
 cin >> str;

 int i = 0;
 while (str[i] != '\000' && i < 100) {
  if ((str[i] > 64 && str[i] < 91) || (str[i] > 96 && str[i] < 123)) {
   replaceLetter(i);
   i++;
  } else {
   if (str[i] == 46) {
    addPct(i);
    i += 2;
   } else {
    if (str[i] >= '0' && str[i] <= '9') {
     removeDigit(i);

    } else {
     str[i] = '#';
     i++;
    }
   }
  }
 }
 cout << str;
}