Un'altra possibilità sarebbe la seguente:
Si inizia con il numero decimale più grande del tipo "1111111 ... 1111" supportato dal tipo di dati utilizzato
L'algoritmo presuppone che l'input sia inferiore a questo numero; altrimenti dovrai usare un altro tipo di dati.
Esempio: quando si utilizza long long
, si inizia con il numero 1111111111111111111
.
- Quindi elaborare ogni cifra decimale da sinistra a destra:
- Prova a cambiare la cifra da 1 a 0.
- Se il risultato è ancora maggiore del tuo input, fai la modifica (cambia la cifra in 0).
- Altrimenti la cifra rimane 1.
Esempio
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 di correttezza:
Elaboriamo cifra per cifra in questo algoritmo. In ogni passaggio, ci sono cifre il cui valore è già noto e cifre i cui valori non sono ancora noti.
In ogni passaggio, sondiamo la cifra sconosciuta più a sinistra.
Impostiamo quella cifra su "0" e tutte le altre cifre sconosciute su "1". Poiché la cifra da sondare è la più significativa delle cifre sconosciute, il numero risultante è il numero più grande possibile con quella cifra che è uno "0". Se questo numero è inferiore o uguale all'ingresso, la cifra da sondare deve essere un "1".
D'altra parte, il numero risultante è più piccolo di tutti i possibili numeri in cui la cifra da sondare è un "1". Se il numero risultante è maggiore dell'input, la cifra deve essere "0".
Ciò significa che possiamo calcolare una cifra in ogni passaggio.
Codice C.
(Anche il codice C dovrebbe funzionare in 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 ...