Другая возможность будет следующей:
Вы начинаете с наибольшего десятичного числа типа "1111111 ... 1111", поддерживаемого используемым типом данных
Алгоритм предполагает, что входное значение меньше этого числа; в противном случае вам придется использовать другой тип данных.
Пример: при использовании long long
вы начинаете с номера 1111111111111111111
.
- Затем обработайте каждую десятичную цифру слева направо:
- Попробуйте изменить цифру от 1 до 0.
- Если результат все еще больше, чем ваш ввод, сделайте изменение (измените цифру на 0).
- В противном случае цифра остается 1.
пример
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
Доказательство правильности:
В этом алгоритме мы обрабатываем цифру за цифрой. На каждом шаге есть цифры, значение которых уже известно, и цифры, значения которых еще не известны.
На каждом шаге мы проверяем крайнюю левую неизвестную цифру.
Мы устанавливаем эту цифру на «0», а все остальные неизвестные цифры на «1». Поскольку исследуемая цифра является самой значимой из неизвестных цифр, результирующее число представляет собой наибольшее возможное число, причем эта цифра равна «0». Если это число меньше или равно входному значению, измеряемая цифра должна быть «1».
С другой стороны, результирующее число меньше всех возможных чисел, где исследуемая цифра равна «1». Если результирующее число больше, чем ввод, цифра должна быть «0».
Это означает, что мы можем вычислить одну цифру на каждом шаге.
Код C
(Код C должен работать и на 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 ...