Sunteți pe pagina 1din 4

AF, SEMINAR, 17.10.

2019

1. Se dă un număr. Să se verifice daca numarul e scris într-o bază b precizată. Dacă da, să se transforme în baza
10. (precizare: numărul dat e maxim în baza 10, iar baza b e maxim 10).

#include <iostream>

int verificareBaza(int numar, int baza)


{
while (numar)
{
if (numar % 10 >= baza)
return 0;
numar /= 10;
}
return 1;
}

int putere(int baza, int exponent)


{
int puterea = 1;
while (exponent)
{
puterea *= baza;
exponent--;
}
return puterea;
}

void transformareBaza10(int &numar, int baza)


{
int auxiliar = 0, index = 0;
while (numar)
{
auxiliar += numar % 10 * putere(baza, index);
numar /= 10;
index++;
}
numar = auxiliar;
}

int main()
{
int numar;
unsigned short baza;
std::cin >> numar >> baza;
if (verificareBaza(numar, baza))
{
std::cout << "Numarul " << numar << " transformat in baza " << baza << " este ";
transformareBaza10(numar, baza);
std::cout << numar;
}
else
std::cout << "Numarul nu este in baza " << baza;
return 0;
}

2. Se dă un număr de maxim 3 cifre. Să se formeze un alt număr / să se folosească același număr care să
respecte condiția: 1122244444.
#include <iostream>

void transformNumber(int vector[], int number, int &lenght)


{
int contor = 0;
int cifra;
do
{
cifra = number % 10;
vector[contor] = cifra;
contor++;
for (int i = contor; i < contor + cifra; i++)
{
vector[i] = cifra;
}
contor += cifra;
number /= 10;
}while (number);
lenght = contor-1;
}

void writeReversedVector(int lenght, int vector[])


{
for (int i = lenght; i >= 0; i--)
std::cout << vector[i];
}

int main()
{
int number, vector[30], lenght;
std::cin >> number;
transformNumber(vector, number, lenght);
writeReversedVector(lenght, vector);
}

3. Se dă un șir de dimensiune n foarte mare care conține doar 0 și 1. Șirul conține toate elementele de 0 la
început si toate elementele de 1 la final. Să se caute câte elemente de 1 sunt în șir (2 variante de rezolvare;
discuție pe complexități).

var 1 : căutare secvențială de elemente 1 într-un contor: O(n);

var 2: parcurgerea vectorului de la dr->stg și numărarea elementelor de 1 cu break: O(n);

var 3: căutare binară pentru primul 1: O(logn)

#include <iostream>

void readVector(int lungimeaSirului, int vector[])


{
for (int i = 0; i < lungimeaSirului; i++)
std::cin >> vector[i];
}

int indexOfFirstOne(int lungimeaSirului, int vector[])


{
int limitaInferioara = 0, limitaSuperioara, mijloc;
limitaSuperioara = lungimeaSirului-1;
mijloc = (limitaInferioara + limitaSuperioara) / 2;
while (limitaInferioara <= limitaSuperioara && vector[mijloc]==vector[mijloc+1] )
{
if (0 < vector[mijloc])
limitaSuperioara = mijloc - 1;
else
limitaInferioara = mijloc + 1;
mijloc = (limitaInferioara + limitaSuperioara) / 2;
}
if (limitaInferioara <= limitaSuperioara)
return mijloc+1;
}
int main()
{
int lungimeaSirului, vector[30], numarElemente;
std::cin >> lungimeaSirului;
readVector(lungimeaSirului, vector);
numarElemente = lungimeaSirului - indexOfFirstOne(lungimeaSirului, vector);
std::cout << numarElemente;
}

var 4: divide et impera cu cazuri particulare: O(logn)

#include <iostream>

void readVector(int lungimeaSirului, int vector[])


{
for (int i = 1; i <= lungimeaSirului; i++)
std::cin >> vector[i];
}

int indexOfFirstOne(int limitaInferioara, int limitaSuperioara, int vector[], int


lungimeaSirului)
{
int mijloc = (limitaInferioara + limitaSuperioara) / 2;
if (0 == vector[mijloc])
if (vector[mijloc + 1] == 1)
return mijloc + 1;
else return indexOfFirstOne(mijloc + 1, limitaSuperioara, vector,
lungimeaSirului);
else
if (vector[mijloc - 1] == 0)
return mijloc;
else return indexOfFirstOne(limitaInferioara, mijloc - 1, vector,
lungimeaSirului);
}
int main()
{
int lungimeaSirului, limitaInferioara = 1, limitaSuperioara, vector[30];
std::cin >> lungimeaSirului;
readVector(lungimeaSirului, vector);
limitaSuperioara = lungimeaSirului;
std::cout<<lungimeaSirului- indexOfFirstOne(limitaInferioara, limitaSuperioara,
vector, lungimeaSirului)+1;
}
4. Se dă o matrice dreptunghiulară în care liniile și coloanele sunt sortate crescător. Se dă un element x care se
caută în matricea dată. Dacă x este găsit, se afișeaza i si j corespunzător poziției lui în matrice, iar daca nu, se
afișează un mesaj.

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

void readMatrixFromFile(int matrice[][10], int& lineNumber, int& columnNumber, string


filePath)
{
ifstream myfile(filePath);
if (myfile.is_open())
{
myfile >> lineNumber >> columnNumber;
for (int currentLine = 0; currentLine < lineNumber; currentLine++)
for (int currentColumn = 0; currentColumn < columnNumber;
currentColumn++)
myfile >> matrice[currentLine][currentColumn];
myfile.close();
}
else
cout << "Unable to open file";
}

int searchElement(int matrice[10][10], int lineNumber, int columnNumber, int &currentLine,


int &currentColumn)
{
int searchedNumber;
cout << "Cauta elementul: ";
cin >> searchedNumber;
while (currentLine < lineNumber && currentColumn>=0)
{
if (matrice[currentLine][currentColumn] == searchedNumber)
return 1;
else
{
if (searchedNumber < matrice[currentLine][currentColumn])
currentColumn--;
else
currentLine++;
}
}
return 0;
}

int main()
{
int matrice[10][10], lineNumber, columnNumber;
string filePathRead = "fileIn.txt";
readMatrixFromFile(matrice, lineNumber, columnNumber, filePathRead);
int currentLine = 0;
int currentColumn = columnNumber - 1;
if (searchElement(matrice, lineNumber, columnNumber, currentLine, currentColumn))
cout << "Elementul se afla pe pozitia " << currentLine << ' ' << currentColumn;
else
cout << "Elementul nu se afla in matricea data";

S-ar putea să vă placă și