19 nov. 2015

Propuneri de enunturi

Nu am mai scris de ceva vreme dar totusi numarul celor care viziteaza blogul este constant.

Daca aveti idei de probleme sau probleme rezolvate puteti sa le lasati in commenturi si voi incerca sa raspund la ele cat de repede posibil.

Scopul final fiind de a crea o colectie cat mai mare de probleme publica.

24 feb. 2013

Furnici altruiste

Problema cu furnicile harnice, au prea mult si s-au hotarat sa imparta la greieri. Pot da unui greier o singura unitate de mancare(boaba grau), toate dau cat da cea mai saraca familie, dar se pot inprumuta intre ele, daca se imprumuta se pierde pe drum 1 unitate de mancare pentru fiecare unitate de distanta(metru) parcursa.
Fisier de intrare:
4
20 300
40 400
340 700
360 600

#include <iostream>
#include <fstream>

using namespace std;

//fisier de intrare
ifstream fin("ants.in");

int main()
{
    //n - numarul de familii de furnici
    //i - index pentru parcurgere
    long n,i;
    //a - distanta pana la tunel
    //b - boabe in plus
    //ap - distanta familiei precedente fata de tinel
    //s - suma boabelor in plus
    double a,b,ap,s=0;
    fin>>n;

    //prima familie
    fin>>a>>b;

    s+=b;
    ap=a;

    //celelalte n-1 familii
    for(i=1;i<n;i++)
    {
        fin>>a>>b;
        b=b-(a-ap);
        s+=b;
        ap=a;
    }

    fin.close();
    //media boabelor exceptand costul drumului
    cout<<(s/n);

    return 0;
}

23 feb. 2013

Basic C++ Hello World

#include <iostream>
#include <conio.h>
using namespace std;

int main ()
{
  cout << "Hello World!";
  getch();
  return 0;
}

20 nov. 2012

Suma elementelor din vector

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
 int n, i, s=0;
 int v[100];
 cout << "n:";
 cin >>n;
 for (i = 0; i < n; i++) {
  cin >> v[i];
 }
 for (i = 0; i < n; i++) {
  s+=v[i];
 }
    cout<<"Suma:"<< s;
}
propuneri de enunturi

9 nov. 2012

Valoarea maxima din vector

#include<iostream.h>

using namespace std;

int main() {
 int n, i, max;
 int v[100];
 cout << "n:";
 cin>>n;
 for (i = 0; i < n; i++) {
  cin >> v[i];
 }
 max = v[0];
 for (i = 1; i < n; i++) {
  if (max < v[i]) {
   max = v[i];
  }
 }
 cout << "maxim: " << max;
 return 0;
}
propuneri de enunturi

Citirea unui vector

Pentru a citi un vector trebuie sa cititi fiecare valoare a lui, preferabil intr-o bucla for. Mai intai trebuie sa stiti dimensiunea vectorului, se va citi de la tastatura si apoi pe rand valorile vectorului.


#include<iostream.h>

using namespace std;

int main() {
 int n, i;
 int v[100];
 cout << "n:";
 cin >> n;
 for (i = 0; i < n; i++) {
  cin >> v[i];
 }
 for (i = 0; i < n; i++) {
  cout << "v[" << i << "]:" << v[i] << endl;
 }
 return 0;
}
propuneri de enunturi

7 nov. 2012

Valoarea maxima dintr-o matrice

Pentru a afla valoarea maxima dintr-o matrice trebuie sa aveti o variabila care retine acea valoare maxima, apoi sa parcurgeti toata matricea si sa cautati valori mai mari decat maximul curent, daca gasiti o valoare mai mare atunci o retineti in variabila de referinta. Dupa ce ati citi o matrice ca in exemplu, gasiti maximul in felul urmator.
int max = matrix[0][0]; 
for (int i = 0; i < lines; i++) { 
     for (int j = 0; j < columns; j++) { 
       if (matrix[i][j] > max) { 
           max = matrix[i][j]; 
       } 
     } 
} 
cout << "Valoarea maxima din matrice este:" << max << endl; 
propuneri de enunturi

Citirea unei matrici

O matrice este un vector de vectori. Are un numar de linii(considerat un vector) si fiecare element din vectorul respectiv este la randul sau un vector(coloane).

#include <iostream>
using namespace std;

int main() {
 //numarul de linii si coloane
 int lines, columns;
 cout << "linii:";
 cin >> lines;
 cout << "colomns:";
 cin >> columns;
//declararea matricei
 int matrix[lines][columns];
//citirea de la tastatura a elementrlor, unul cate unul
 for (int i = 0; i < lines; i++) {
  for (int j = 0; j < columns; j++) {
   cout << "matrix[" << i << "][" << j << "]:";
   cin >> matrix[i][j];
  }
 }
//afirare in bloc a matricei
 cout << "Afisare matrice:" << endl;
 for (int i = 0; i < lines; i++) {
  for (int j = 0; j < columns; j++) {
   cout << matrix[i][j] << " ";
  }
  cout << endl;
 }
}
propuneri de enunturi

17 iul. 2012

Numarul de cifre

Sa numaram cate cifre de fiecare grad sunt intr-un numar. Cate cifre de 1, cate de 2 s.a.m.d. Varianta este de forta bruta, ar terbui folosit un vector unidimensional de lungime 10.

#include <iostream>
using namespace std;

int main() {

 int n;
 int c;
 //initializam numerul de cifre
 int i0 = 0, i1 = 0, i2 = 0, i3 = 0, i4 = 0, i5 = 0, i6 = 0, i7 = 0, i8 = 0,
   i9 = 0;
 //citim n
 cin >> n;

 // numaram cifrele
 while (n) {
  c = n % 10;
  n = n / 10;
  switch (c) {
  case 0:
   i0++;
   break;
  case 1:
   i1++;
   break;
  case 2:
   i2++;
   break;
  case 3:
   i3++;
   break;
  case 4:
   i4++;
   break;
  case 5:
   i5++;
   break;
  case 6:
   i6++;
   break;
  case 7:
   i7++;
   break;
  case 8:
   i8++;
   break;
  case 9:
   i9++;
   break;
  }
 }
 //afizam cifrele
 cout << "Numarul are: \n";
 cout << "[" << i0 << "]" << " de 0\n";
 cout << "[" << i1 << "]" << " de 1\n";
 cout << "[" << i2 << "]" << " de 2\n";
 cout << "[" << i3 << "]" << " de 3\n";
 cout << "[" << i4 << "]" << " de 4\n";
 cout << "[" << i5 << "]" << " de 5\n";
 cout << "[" << i6 << "]" << " de 6\n";
 cout << "[" << i7 << "]" << " de 7\n";
 cout << "[" << i8 << "]" << " de 8\n";
 cout << "[" << i9 << "]" << " de 9\n";
 return 0;
}

Dupa cum se observa un astfel de program este foarte lung chiar daca este simplu de scris.
O versiune mai compacta a acestui program este urmatoarea:
#include <iostream>
using namespace std;

int main() {
 int n;
 int v[10];
 int c;

 for (int i = 0; i < 10; i++) {
  v[i] = 0;
 }

 cin >> n;

 while (n) {
  c = n % 10;
  n = n / 10;
  v[c]++;
 }

 for (int i = 0; i < 10; i++) {
  cout << "[" << v[i] << "]" << " de " << i << "\n";
 }
 return 0;
}
Resultatul este acelasi, dar codul este mai compact, si mai usor de urmarit.

30 mai 2012

O simpla scriere in fisier

Un exemplu de program care scrie un simplu text in fisier. stocare permanenta pe HDD.

#include <iostream>
#include <fstream>
using namespace std;

int main() {
 ofstream myfile;
 myfile.open("exemplu.txt");
 myfile << "Scrie in fisier";
 myfile.close();
 return 0;
}
propuneri de enunturi

Palindrom de 9 cifre

Sa se scrie un program care afiseaza toate palindroamele de 9 cifre.

#include <iostream>
using namespace std;

int invers(int n) {
 int i = 0;
 while (n > 0) {
  i = (i * 10) + n % 10;
  n = n / 10;
 }
 return i;
}

int main() {

 int nr;
 for (int i = 10010; i < 100000; i++) {
  nr = i;
  cout << i << invers(nr / 10) << endl;
 }
 return 0;
}

14 ian. 2012

Idei de probleme

     Salut,

   Pentru cei care se mai uita din cand in gand pe blogul asta si ar vrea sa mai vada solutii noi la probleme si mai noi, va rog sa lasati un comment.

  multa bafta

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

28 nov. 2011

Fibonacci number

Sirul lui Fibonacci, primele 30 de numere din acest sir
#include <iostream>

using namespace std;

int main() {

 int u = 0;
 int v = 1;
 int i, t;

 for (i = 2; i <= 30; i++) {
  t = u + v;
  u = v;
  v = t;
  cout << t << ", ";
 }
 return 0;
}