Une autre possibilité serait la suivante:
Vous commencez avec le plus grand nombre décimal du type "1111111 ... 1111" pris en charge par le type de données utilisé
L'algorithme suppose que l'entrée est inférieure à ce nombre; sinon, vous devrez utiliser un autre type de données.
Exemple: lorsque vous utilisez long long
, vous commencez par le nombre1111111111111111111
.
- Ensuite, traitez chaque chiffre décimal de gauche à droite:
- Essayez de changer le chiffre de 1 à 0.
- Si le résultat est toujours supérieur à votre saisie, effectuez la modification (changez le chiffre en 0).
- Sinon, le chiffre reste 1.
Exemple
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
Preuve de correction:
Nous traitons chiffre par chiffre dans cet algorithme. À chaque étape, il y a des chiffres dont la valeur est déjà connue et des chiffres dont les valeurs ne sont pas encore connues.
À chaque étape, nous sondons le chiffre inconnu le plus à gauche.
Nous avons mis ce chiffre à "0" et tous les autres chiffres inconnus à "1". Étant donné que le chiffre à sonder est le plus important des chiffres inconnus, le nombre résultant est le plus grand nombre possible, ce chiffre étant un "0". Si ce nombre est inférieur ou égal à l'entrée, le chiffre sondé doit être un "1".
D'un autre côté, le nombre résultant est plus petit que tous les nombres possibles où le chiffre sondé est un "1". Si le nombre résultant est supérieur à l'entrée, le chiffre doit être "0".
Cela signifie que nous pouvons calculer un chiffre à chaque étape.
Code C
(Le code C devrait également fonctionner sous 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 ...