Outra possibilidade seria a seguinte:
Você começa com o maior número decimal do tipo "1111111 ... 1111" suportado pelo tipo de dados usado
O algoritmo assume que a entrada é menor que esse número; caso contrário, você terá que usar outro tipo de dados.
Exemplo: Ao usar long long
, você começa com o número 1111111111111111111
.
- Em seguida, processe cada dígito decimal da esquerda para a direita:
- Tente alterar o dígito de 1 para 0.
- Se o resultado ainda for maior que sua entrada, faça a alteração (altere o dígito para 0).
- Caso contrário, o dígito permanece 1.
Exemplo
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
Prova de correção:
Processamos dígito por dígito neste algoritmo. Em cada etapa, existem dígitos cujo valor já é conhecido e dígitos cujos valores ainda não são conhecidos.
Em cada etapa, analisamos o dígito desconhecido mais à esquerda.
Definimos esse dígito para "0" e todos os outros dígitos desconhecidos para "1". Como o dígito a ser sondado é o mais significativo dos dígitos desconhecidos, o número resultante é o maior número possível, sendo esse dígito um "0". Se esse número for menor ou igual à entrada, o dígito que está sendo testado deve ser um "1".
Por outro lado, o número resultante é menor que todos os números possíveis, onde o dígito que está sendo sondado é um "1". Se o número resultante for maior que a entrada, o dígito deverá ser "0".
Isso significa que podemos calcular um dígito em cada etapa.
Código C
(O código C também deve funcionar em 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 ...