Otra posibilidad sería la siguiente:
Comienza con el número decimal más grande del tipo "1111111 ... 1111" admitido por el tipo de datos utilizado
El algoritmo supone que la entrada es menor que este número; de lo contrario, tendrá que usar otro tipo de datos.
Ejemplo: al usar long long
, comienza con el número 1111111111111111111
.
- Luego procese cada dígito decimal de izquierda a derecha:
- Intenta cambiar el dígito de 1 a 0.
- Si el resultado sigue siendo mayor que su entrada, realice el cambio (cambie el dígito a 0).
- De lo contrario, el dígito permanece 1.
Ejemplo
Input = 10103
Start: 111111
Step 1: [1]11111, try [0]11111; 011111 > 10103 => 011111
Step 2: 0[1]1111, try 0[0]1111; 001111 < 10103 => 011111
Step 3: 01[1]111, try 01[0]111; 010111 > 10103 => 010111
Step 4: 010[1]11, try 010[0]11; 010011 < 10103 => 010111
Step 5: 0101[1]1, try 0101[0]1; 010101 < 10103 => 010111
Step 6: 01011[1], try 01011[0]; 010110 > 10103 => 010110
Result: 010110
Prueba de corrección:
Procesamos dígito a dígito en este algoritmo. En cada paso, hay dígitos cuyo valor ya se conoce y dígitos cuyos valores aún no se conocen.
En cada paso, exploramos el dígito desconocido más a la izquierda.
Establecemos ese dígito en "0" y todos los demás dígitos desconocidos en "1". Debido a que el dígito a sondear es el más significativo de los dígitos desconocidos, el número resultante es el número más grande posible con ese dígito siendo un "0". Si este número es menor o igual a la entrada, el dígito que se está probando debe ser un "1".
Por otro lado, el número resultante es más pequeño que todos los números posibles donde el dígito que se está probando es un "1". Si el número resultante es mayor que la entrada, el dígito debe ser "0".
Esto significa que podemos calcular un dígito en cada paso.
Código C
(El código C también debería funcionar en C ++):
long long input;
long long result;
long long digit;
... read in input ...
result = 1111111111111111111ll;
digit = 1000000000000000000ll;
while( digit > 0 )
{
if(result - digit > input)
{
result -= digit;
}
digit /= 10;
}
... print out output ...