Входное целое число может иметь максимальное значение 2^24 - 1
, массив символов длиной 6 байтов ... имея возможность изменить PostProcess()
, это было бы легко: 6 символов - это как раз то, что требуется для хранения 24-битное целое число в формате HEX. Символ каждые 4 байта; максимальное значение (0x) FFFFFF
.
Но реализация PostProcess()
исправлена и имеет вид "max-6-digits-atoi" . Таким образом, если значение входного буфера равно {'3', '4', '5', '6', '7', '8'}
, то целое число 345678
.
Кажется, что 999999
может быть напечатано не более, , но здесь возникает хитрость : кто ли нам хранить в буфере символов только цифры? У нас нет никаких ограничений (но мы должны полагаться на ASCII схему кодирования).
Стратегия
- Давайте удостоверимся, что Чтобы 5 байтов буфера символов содержали десятичное представление входного числа. Таким образом,
PostProcess
преобразует эти цифры, как и ожидалось. Значение этих цифр может быть вычислено как in % 100000
- Будучи максимальным входным значением
2^24-1 = 16777215
, мы должны представить диапазон [0-167]
с первым байтом массива - , так как
PostProcess
вычтет '0'
из pu8Input[0]
, мы обязательно компенсируем его при генерации pu8Input[0]
кода
#include <stdio.h>
#include <string.h>
void PreProcess(unsigned int in, unsigned char out[])
{
if(in <= 16777215)
{
char aux[7];
unsigned int auxInt = in % 100000;
unsigned char firstchar;
firstchar = (in / 100000) + '0';
sprintf( aux, "%c%05u", firstchar, auxInt );
memcpy( out, aux, 6 );
}
}
Суммируя:
- Мы вычисляем остаток
auxInt = in % 100000
- Мы вычисляем ведущий символ как
firstchar = (in / 100000) + '0'
- Мы складываем их вместе с
sprintf
, используя вспомогательный символ буфер длиной 7 байт (потому что нам нужно место для ограничителя строки) - Мы
memcpy
вспомогательный буфер символов для буфера вывода