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

24 dec. 2011

Setare variabila in Path in Windows 7

Pentru a folosi MinGW in windows cu un GUI precum Eclipse, trebuie setata variabila gcc in Path-ul de la windows. Dupa ce instalati MinGW executati pasii urmatori:
  1. Click pe Start
  2. Click dreapta pe Computer
  3. Din meniul contextual dati click pe Properties 
  4. Click pe 'Advanced system settings' din coltul stanga sus (Control panel Home img). 
  5. Control Panel Home
  6. Se va afisa fereatra 'System propertis'
  7. Click pe Tab-ul 'Advanced'
  8. Click pe Enviroment Variables
  9. Enviroment variables
  10. Pentru a adauga MinGW in Path selectati variabila de sistem Path si selectati 'Edit...'. Apoi adaugati in valoarea acelei variabile calea catre MinGW.
Salvati toate modificarile.

Acum puteti folosi compilatorul gcc in Eclipse folosind MinGW.

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

18 dec. 2011

Inversare partea intreaga cu zecimale

enunt: Sa se inverseze partea intreaga cu partea zecimala a unui numar real.
exemplu: pentru 12.34 se va afisa 34.12

#include <stdio.h>
int main(int argc, char *argv[])
{
 double daux = 12.34;
 int integr = daux;
 int iaux = integr;
 double zaux;
 double zecim = integr;
 
 int a=daux;
 while(a != daux){
  daux = daux * 10;
  a = daux;
  integr = integr * 10;
 }
 zecim = daux-integr;
 
 zaux = iaux;
 while(iaux){
  iaux = iaux / 10;
  zaux = zaux / 10;
 }
 
 printf("numar=%f",zecim+zaux);
 
 return 0;
}
propuneri de enunturi

4 dec. 2011

Sortarea cifrelor unui numar

Programul urmator sorteaza cifrele unui numar intreg


#include <iostream>

using namespace std;

/*
 * functia sort - bubble sort simplificat
 *
 * primeste vectorul pentru sortare si dimensiunea folosita
 *
 * returneaza adresa vectorului sortat
 */
int* sort(int n[], int size) {
 bool f = true;
 int tmp;

 //cat timp mai sunt interschimbari
 while (f) {
  f = false;
  // verifica daca mai sunt intersichimbari
  for (int i = 1; i < size; i++) {
   if (n[i - 1] > n[i]) {
    tmp = n[i - 1];
    n[i - 1] = n[i];
    n[i] = tmp;
    f = true;
   }
  }
 }
 return n;
}

int main() {
 // vectorul care va tine cifrele
 int v[10];
 // n - numarul dat
 int n;
 // numarul de cifre
 int i = 0;

 cin >> n;

 // cat timp n mai are cifre
 // le parcurgem si le punem in vector
 while (n != 0) {
  v[i] = n % 10;
  n = n / 10;
  i++;
 }

 //sortam vectorul
 sort(v, i);

 for (int j = 0; j < i; j++) {
  cout << v[j] << ',';
 }
 return 0;
}
propuneri de enunturi

Numar suspect

Un numar e suspect daca e sufixul patratului sau.


#include <iostream>

using namespace std;

int main() {

 int n, i = 0, ii, total = 0;
 cin >> n;

 while (total < n) {
  i++;
  ii = i * i;
  int val = i;
  bool f = true;
  while (i != 0) {
   int ci = i % 10;
   int cii = ii % 10;

   i = i / 10;
   ii = ii / 10;

   if (ci != cii) {
    f = false;
    break;
   }
  }
  i = val;
  if (f) {
   cout << val << ", ";
   total++;
  }
 }
 return 0;
}

1 dec. 2011

CMMDC

Folosind algoritmul lui Euclid calculez cel mai mare divizor comun


#include <iostream>

using namespace std;

int main() {
 int a, b;
 cin >> a;
 cin >> b;
 while (a != b) {
  if (a > b)
   a = a - b;
  else
   b = b - a;
 }
 cout << "cmmdc= " << a;
 return 0;
}
propuneri de enunturi