Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions solutions/cpp/all-your-base/1/all_your_base.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#include "all_your_base.h"
#include <stdexcept>
#include <algorithm>

using namespace std;

namespace all_your_base {

vector<unsigned int> convert(unsigned int from_base,
const vector<unsigned int>& input_digits,
unsigned int to_base) {

// 1. El sistema posicional requiere una base m铆nima de 2
if (from_base <= 1 || to_base <= 1){
throw invalid_argument("Las bases deben ser mayor o igual a 2");
}

// 2. Fase de Acumulaci贸n (Base A -> Base 10)
unsigned int decimal_value = 0;
bool leading_zero = true;

for (unsigned int digit : input_digits) {
// Validaci贸n de rango: Un d铆gito no puede ser igual o mayor que su base
if (digit >= from_base) {
throw invalid_argument("D铆gito inv谩lido para la base");
}

// Detectar si hay ceros no significativos a la izquierda
if (leading_zero && digit == 0) {
continue; // Los ignoramos en el c谩lculo
}
leading_zero = false;

// Desplazamiento posicional y acumulaci贸n matem谩tica
decimal_value = (decimal_value * from_base) + digit;
}

// Si la entrada estaba vac铆a o consist铆a 煤nicamente en ceros
if (decimal_value == 0) {
return {};
}

// 3. Fase de Descomposici贸n (Base 10 -> Base B)
vector<unsigned int> output_digits;

while (decimal_value > 0) {
unsigned int remainder = decimal_value % to_base;
output_digits.push_back(remainder);
decimal_value /= to_base;
}

// Invertimos el vector para devolver el orden posicional correcto
std::reverse(output_digits.begin(), output_digits.end());

return output_digits;
}

}
12 changes: 12 additions & 0 deletions solutions/cpp/all-your-base/1/all_your_base.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#pragma once
#include <vector>

namespace all_your_base {

// Convierte un vector de d铆gitos de una base origen a una base destino.
// Lanza std::invalid_argument si las bases o los d铆gitos son incorrectos.
std::vector<unsigned int> convert(unsigned int from_base,
const std::vector<unsigned int>& input_digits,
unsigned int to_base);

}