Inną możliwością byłaby następująca:
Zaczynasz od największej liczby dziesiętnej typu „1111111 ... 1111” obsługiwanej przez użyty typ danych
Algorytm zakłada, że dane wejściowe są mniejsze niż ta liczba; w przeciwnym razie będziesz musiał użyć innego typu danych.
Przykład: Podczas używania long long
zaczynasz od numeru 1111111111111111111
.
- Następnie przetwarzaj każdą cyfrę dziesiętną od lewej do prawej:
- Spróbuj zmienić cyfrę z 1 na 0.
- Jeśli wynik jest nadal większy niż wprowadzony, dokonaj zmiany (zmień cyfrę na 0).
- W przeciwnym razie cyfra pozostaje 1.
Przykład
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
Dowód poprawności:
W tym algorytmie przetwarzamy cyfra po cyfrze. Na każdym etapie znajdują się cyfry, których wartość jest już znana, i cyfry, których wartości nie są jeszcze znane.
Na każdym kroku badamy najbardziej nieznaną lewą cyfrę.
Ustawiamy tę cyfrę na „0”, a wszystkie inne nieznane cyfry na „1”. Ponieważ cyfra, która ma być sondowana, jest najbardziej znaczącą z nieznanych cyfr, wynikowa liczba jest największą możliwą liczbą, przy czym cyfra ta to „0”. Jeśli liczba ta jest mniejsza lub równa wartości wejściowej, badana cyfra musi być „1”.
Z drugiej strony wynikowa liczba jest mniejsza niż wszystkie możliwe liczby, w których badana cyfra to „1”. Jeśli wynikowa liczba jest większa niż wartość wejściowa, cyfra musi wynosić „0”.
Oznacza to, że możemy obliczyć jedną cyfrę na każdym kroku.
Kod C.
(Kod C powinien również działać w 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 ...