Appearance
C++
Número primo
cpp
#include <iostream>
bool is_prime(int num) {
if (num <= 1) {
return false;
} else if (num <= 3) {
return true;
} else if (num % 2 == 0 || num % 3 == 0) {
return false;
}
int i = 5;
while (i * i <= num) {
if (num % i == 0 || num % (i + 2) == 0) {
return false;
}
i += 6;
}
return true;
}#include <iostream>
bool is_prime(int num) {
if (num <= 1) {
return false;
} else if (num <= 3) {
return true;
} else if (num % 2 == 0 || num % 3 == 0) {
return false;
}
int i = 5;
while (i * i <= num) {
if (num % i == 0 || num % (i + 2) == 0) {
return false;
}
i += 6;
}
return true;
}MergeSort [E]
cpp
#include <iostream>
#include <vector>
// Não invocar diretamente
std::vector<int> merge(std::vector<int>& left, std::vector<int>& right) {
std::vector<int> result;
size_t i = 0, j = 0;
while (i < left.size() && j < right.size()) {
if (left[i] <= right[j]) {
result.push_back(left[i]);
i++;
} else {
result.push_back(right[j]);
j++;
}
}
while (i < left.size()) {
result.push_back(left[i]);
i++;
}
while (j < right.size()) {
result.push_back(right[j]);
j++;
}
return result;
}
std::vector<int> merge_sort(std::vector<int>& arr) {
if (arr.size() <= 1) {
return arr;
}
size_t mid = arr.size() / 2;
std::vector<int> left(arr.begin(), arr.begin() + mid);
std::vector<int> right(arr.begin() + mid, arr.end());
left = merge_sort(left);
right = merge_sort(right);
return merge(left, right);
}#include <iostream>
#include <vector>
// Não invocar diretamente
std::vector<int> merge(std::vector<int>& left, std::vector<int>& right) {
std::vector<int> result;
size_t i = 0, j = 0;
while (i < left.size() && j < right.size()) {
if (left[i] <= right[j]) {
result.push_back(left[i]);
i++;
} else {
result.push_back(right[j]);
j++;
}
}
while (i < left.size()) {
result.push_back(left[i]);
i++;
}
while (j < right.size()) {
result.push_back(right[j]);
j++;
}
return result;
}
std::vector<int> merge_sort(std::vector<int>& arr) {
if (arr.size() <= 1) {
return arr;
}
size_t mid = arr.size() / 2;
std::vector<int> left(arr.begin(), arr.begin() + mid);
std::vector<int> right(arr.begin() + mid, arr.end());
left = merge_sort(left);
right = merge_sort(right);
return merge(left, right);
}QuickSort [NE]
cpp
#include <iostream>
#include <vector>
std::vector<int> quicksort(std::vector<int>& arr) {
if (arr.size() <= 1) {
return arr;
}
int pivot = arr[arr.size() / 2];
std::vector<int> left, middle, right;
for (int num : arr) {
if (num < pivot) {
left.push_back(num);
} else if (num == pivot) {
middle.push_back(num);
} else {
right.push_back(num);
}
}
std::vector<int> sorted_left = quicksort(left);
std::vector<int> sorted_right = quicksort(right);
sorted_left.insert(sorted_left.end(), middle.begin(), middle.end());
sorted_left.insert(sorted_left.end(), sorted_right.begin(), sorted_right.end());
return sorted_left;
}#include <iostream>
#include <vector>
std::vector<int> quicksort(std::vector<int>& arr) {
if (arr.size() <= 1) {
return arr;
}
int pivot = arr[arr.size() / 2];
std::vector<int> left, middle, right;
for (int num : arr) {
if (num < pivot) {
left.push_back(num);
} else if (num == pivot) {
middle.push_back(num);
} else {
right.push_back(num);
}
}
std::vector<int> sorted_left = quicksort(left);
std::vector<int> sorted_right = quicksort(right);
sorted_left.insert(sorted_left.end(), middle.begin(), middle.end());
sorted_left.insert(sorted_left.end(), sorted_right.begin(), sorted_right.end());
return sorted_left;
}Progressão aritmética
cpp
#include <iostream>
#include <vector>
std::vector<int> progressao_aritmetica(int a1, int r, int n) {
std::vector<int> termos;
for (int i = 0; i < n; i++) {
int proximo_termo = a1 + i * r;
termos.push_back(proximo_termo);
}
return termos;
}
int main() {
int a1 = 2; // Primeiro termo
int r = 3; // Razão da progressão
int n = 5; // Número de termos
std::vector<int> pa = progressao_aritmetica(a1, r, n);
std::cout << "Progressão Aritmética:";
for (int termo : pa) {
std::cout << " " << termo;
}
std::cout << std::endl;
return 0;
}#include <iostream>
#include <vector>
std::vector<int> progressao_aritmetica(int a1, int r, int n) {
std::vector<int> termos;
for (int i = 0; i < n; i++) {
int proximo_termo = a1 + i * r;
termos.push_back(proximo_termo);
}
return termos;
}
int main() {
int a1 = 2; // Primeiro termo
int r = 3; // Razão da progressão
int n = 5; // Número de termos
std::vector<int> pa = progressao_aritmetica(a1, r, n);
std::cout << "Progressão Aritmética:";
for (int termo : pa) {
std::cout << " " << termo;
}
std::cout << std::endl;
return 0;
}Progressão geométrica
cpp
#include <iostream>
#include <vector>
std::vector<int> progressao_geometrica(int a1, int razao, int n) {
std::vector<int> termos;
termos.push_back(a1);
for (int i = 1; i < n; i++) {
int proximo_termo = termos.back() * razao;
termos.push_back(proximo_termo);
}
return termos;
}
int main() {
int a1 = 2; // Primeiro termo
int razao = 3; // Razão da progressão
int n = 5; // Número de termos
std::vector<int> pg = progressao_geometrica(a1, razao, n);
std::cout << "Progressão Geométrica:";
for (int termo : pg) {
std::cout << " " << termo;
}
std::cout << std::endl;
return 0;
}#include <iostream>
#include <vector>
std::vector<int> progressao_geometrica(int a1, int razao, int n) {
std::vector<int> termos;
termos.push_back(a1);
for (int i = 1; i < n; i++) {
int proximo_termo = termos.back() * razao;
termos.push_back(proximo_termo);
}
return termos;
}
int main() {
int a1 = 2; // Primeiro termo
int razao = 3; // Razão da progressão
int n = 5; // Número de termos
std::vector<int> pg = progressao_geometrica(a1, razao, n);
std::cout << "Progressão Geométrica:";
for (int termo : pg) {
std::cout << " " << termo;
}
std::cout << std::endl;
return 0;
}Árvore binária
cpp
#include <iostream>
class No {
public:
int valor;
No* filho_esquerdo;
No* filho_direito;
No(int v) : valor(v), filho_esquerdo(nullptr), filho_direito(nullptr) {}
};
int main() {
No* raiz = new No(1);
raiz->filho_esquerdo = new No(2);
raiz->filho_direito = new No(3);
// Fazer operações com a árvore aqui
delete raiz->filho_esquerdo;
delete raiz->filho_direito;
delete raiz;
return 0;
}#include <iostream>
class No {
public:
int valor;
No* filho_esquerdo;
No* filho_direito;
No(int v) : valor(v), filho_esquerdo(nullptr), filho_direito(nullptr) {}
};
int main() {
No* raiz = new No(1);
raiz->filho_esquerdo = new No(2);
raiz->filho_direito = new No(3);
// Fazer operações com a árvore aqui
delete raiz->filho_esquerdo;
delete raiz->filho_direito;
delete raiz;
return 0;
}Árvore binária de busca (BST)
cpp
#include <iostream>
class NoBST {
public:
int valor;
NoBST* filho_esquerdo;
NoBST* filho_direito;
NoBST(int v) : valor(v), filho_esquerdo(nullptr), filho_direito(nullptr) {}
};
class ArvoreBinariaDeBusca {
public:
NoBST* raiz;
ArvoreBinariaDeBusca() : raiz(nullptr) {}
void inserir(int valor) {
raiz = inserir_recursivamente(raiz, valor);
}
NoBST* inserir_recursivamente(NoBST* no, int valor) {
if (no == nullptr) {
return new NoBST(valor);
}
if (valor < no->valor) {
no->filho_esquerdo = inserir_recursivamente(no->filho_esquerdo, valor);
} else {
no->filho_direito = inserir_recursivamente(no->filho_direito, valor);
}
return no;
}
NoBST* buscar(int valor) {
return buscar_recursivamente(raiz, valor);
}
NoBST* buscar_recursivamente(NoBST* no, int valor) {
if (no == nullptr || no->valor == valor) {
return no;
}
if (valor < no->valor) {
return buscar_recursivamente(no->filho_esquerdo, valor);
} else {
return buscar_recursivamente(no->filho_direito, valor);
}
}
};
int main() {
ArvoreBinariaDeBusca arvore;
arvore.inserir(10);
arvore.inserir(5);
arvore.inserir(15);
NoBST* resultado = arvore.buscar(5);
if (resultado) {
std::cout << "Valor 5 encontrado na árvore!" << std::endl;
} else {
std::cout << "Valor 5 não encontrado na árvore." << std::endl;
}
return 0;
}#include <iostream>
class NoBST {
public:
int valor;
NoBST* filho_esquerdo;
NoBST* filho_direito;
NoBST(int v) : valor(v), filho_esquerdo(nullptr), filho_direito(nullptr) {}
};
class ArvoreBinariaDeBusca {
public:
NoBST* raiz;
ArvoreBinariaDeBusca() : raiz(nullptr) {}
void inserir(int valor) {
raiz = inserir_recursivamente(raiz, valor);
}
NoBST* inserir_recursivamente(NoBST* no, int valor) {
if (no == nullptr) {
return new NoBST(valor);
}
if (valor < no->valor) {
no->filho_esquerdo = inserir_recursivamente(no->filho_esquerdo, valor);
} else {
no->filho_direito = inserir_recursivamente(no->filho_direito, valor);
}
return no;
}
NoBST* buscar(int valor) {
return buscar_recursivamente(raiz, valor);
}
NoBST* buscar_recursivamente(NoBST* no, int valor) {
if (no == nullptr || no->valor == valor) {
return no;
}
if (valor < no->valor) {
return buscar_recursivamente(no->filho_esquerdo, valor);
} else {
return buscar_recursivamente(no->filho_direito, valor);
}
}
};
int main() {
ArvoreBinariaDeBusca arvore;
arvore.inserir(10);
arvore.inserir(5);
arvore.inserir(15);
NoBST* resultado = arvore.buscar(5);
if (resultado) {
std::cout << "Valor 5 encontrado na árvore!" << std::endl;
} else {
std::cout << "Valor 5 não encontrado na árvore." << std::endl;
}
return 0;
}Grafo
cpp
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <limits>
class Grafo {
public:
std::map<std::string, std::map<std::string, int>> vertices;
void adicionar_vertice(const std::string& vertice) {
vertices[vertice] = std::map<std::string, int>();
}
void adicionar_aresta(const std::string& origem, const std::string& destino, int peso) {
vertices[origem][destino] = peso;
vertices[destino][origem] = peso;
}
std::string menor_caminho(const std::string& origem, const std::string& destino) {
std::set<std::string> visitados;
std::map<std::string, int> distancias;
std::map<std::string, std::string> caminho_anterior;
for (const auto& pair : vertices) {
distancias[pair.first] = std::numeric_limits<int>::max();
}
distancias[origem] = 0;
while (visitados.size() < vertices.size()) {
std::string vertice_atual = "";
for (const auto& pair : vertices) {
if (visitados.find(pair.first) == visitados.end()) {
if (vertice_atual.empty() || distancias[pair.first] < distancias[vertice_atual]) {
vertice_atual = pair.first;
}
}
}
visitados.insert(vertice_atual);
for (const auto& pair : vertices[vertice_atual]) {
std::string vizinho = pair.first;
int peso = pair.second;
int distancia = distancias[vertice_atual] + peso;
if (distancia < distancias[vizinho]) {
distancias[vizinho] = distancia;
caminho_anterior[vizinho] = vertice_atual;
}
}
}
std::vector<std::string> caminho;
std::string atual = destino;
while (atual != origem) {
caminho.push_back(atual);
atual = caminho_anterior[atual];
}
caminho.push_back(origem);
std::reverse(caminho.begin(), caminho.end());
std::string caminho_com_pesos;
for (const std::string& vertice : caminho) {
caminho_com_pesos += vertice + " (" + std::to_string(distancias[vertice]) + "), ";
}
// Remover a vírgula e o espaço extra no final
caminho_com_pesos = caminho_com_pesos.substr(0, caminho_com_pesos.size() - 2);
return caminho_com_pesos;
}
};
int main() {
Grafo grafo;
grafo.adicionar_vertice("A");
grafo.adicionar_vertice("B");
grafo.adicionar_vertice("C");
grafo.adicionar_aresta("A", "B", 1);
grafo.adicionar_aresta("B", "C", 2);
grafo.adicionar_aresta("A", "C", 4);
std::string caminho = grafo.menor_caminho("A", "C");
std::cout << "Menor caminho de A para C: " << caminho << std::endl;
return 0;
}#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <limits>
class Grafo {
public:
std::map<std::string, std::map<std::string, int>> vertices;
void adicionar_vertice(const std::string& vertice) {
vertices[vertice] = std::map<std::string, int>();
}
void adicionar_aresta(const std::string& origem, const std::string& destino, int peso) {
vertices[origem][destino] = peso;
vertices[destino][origem] = peso;
}
std::string menor_caminho(const std::string& origem, const std::string& destino) {
std::set<std::string> visitados;
std::map<std::string, int> distancias;
std::map<std::string, std::string> caminho_anterior;
for (const auto& pair : vertices) {
distancias[pair.first] = std::numeric_limits<int>::max();
}
distancias[origem] = 0;
while (visitados.size() < vertices.size()) {
std::string vertice_atual = "";
for (const auto& pair : vertices) {
if (visitados.find(pair.first) == visitados.end()) {
if (vertice_atual.empty() || distancias[pair.first] < distancias[vertice_atual]) {
vertice_atual = pair.first;
}
}
}
visitados.insert(vertice_atual);
for (const auto& pair : vertices[vertice_atual]) {
std::string vizinho = pair.first;
int peso = pair.second;
int distancia = distancias[vertice_atual] + peso;
if (distancia < distancias[vizinho]) {
distancias[vizinho] = distancia;
caminho_anterior[vizinho] = vertice_atual;
}
}
}
std::vector<std::string> caminho;
std::string atual = destino;
while (atual != origem) {
caminho.push_back(atual);
atual = caminho_anterior[atual];
}
caminho.push_back(origem);
std::reverse(caminho.begin(), caminho.end());
std::string caminho_com_pesos;
for (const std::string& vertice : caminho) {
caminho_com_pesos += vertice + " (" + std::to_string(distancias[vertice]) + "), ";
}
// Remover a vírgula e o espaço extra no final
caminho_com_pesos = caminho_com_pesos.substr(0, caminho_com_pesos.size() - 2);
return caminho_com_pesos;
}
};
int main() {
Grafo grafo;
grafo.adicionar_vertice("A");
grafo.adicionar_vertice("B");
grafo.adicionar_vertice("C");
grafo.adicionar_aresta("A", "B", 1);
grafo.adicionar_aresta("B", "C", 2);
grafo.adicionar_aresta("A", "C", 4);
std::string caminho = grafo.menor_caminho("A", "C");
std::cout << "Menor caminho de A para C: " << caminho << std::endl;
return 0;
}