Не записывая фактический код, здесь приведено описание простого алгоритма, основанного на таблице поиска элементов из 64 элементов. 0 = ZERO, 1 = ONE, 2 = TWO ... 63 = SIXTY THREE. Эта таблица будет массивом из 64 элементов. Для C вы можете создать статический 2D-массив, используя char [256], чтобы удерживать ваши строки (или оптимизировать, используя значение самой большой строки + 1), или вы можете сделать динамическое использование с помощью malloc в For Loop)
Затем вы определяете свою выходную строку.
Затем вы пишете цикл «For Loop», итерации по всем битам с использованием битовой маски (с использованием сдвига влево), если бит установлен, вы можете объединить вашу выходную строку (используя strcat) с пробелом и содержимым вашей таблицы поиска для этой позиции бита.
Вот краткий фрагмент кода о том, как вы будете выполнять конкатенацию: (Убедитесь, что в строке вывода имеется достаточно памяти в переменной outputstring для хранения самой большой строки. Если вы хотите быть более сложным и оптимизировать использование памяти, вы можно использовать таНос и перераспределить, но вам приходится иметь дело с не освобождая память, когда он больше не нужен.
#include <stdio.h>
#include <string.h>
int main()
{
char str[80];
strcpy (str,"these ");
strcat (str,"strings ");
strcat (str,"are ");
strcat (str,"concatenated.");
puts (str);
return 0;
}
в вашем случае, бит 3 будет встречаться в качестве первого набора бит и строка вывода затем будет содержать «ТРИ», затем на следующем итерационном бите будет обнаружен как установленный, и выход будет добавлен как «THREE FOUR».
Примечание: поскольку это, как представляется, является академической проблемой, я хотел бы указать, что здесь существует классический случай сложности против космического компромисса. Мое описание выше было минимальной сложностью за счет пространства. Значит, у вас будет 64 строки с избыточностью во многих из этих строк. Например: ДВАДЦАТЬ ДВА, ТРИДЦАТЬ ДВА, ЧЕТЫРЕ ДВА, ПЯТЬ ДВЕ И ШЕСТЬДЕСЯТ ДВА, все содержат строку «ДВЕ». Пространство можно оптимизировать, используя половину строк: ZERO, ONE, через NINETEEN, затем ДВАДЦАТЬ, ТРИДЦАТЬ, СОРОК, ПЯТЬ, ШЕСТЬДЕСЯТ. Однако ваша логика индексирования будет более сложной для бит, превышающий ДВАДЦАТЬ. для бит 21 вам необходимо объединить ДВАДЦАТЬ И ОДИН.
Почему вы определили функцию для возврата 'char *', в то время как вы фактически возвращаете 'unsigned int'? – Matso
Matso, определите количество битов, их позиции и выводимые строки из них. который я пробовал. –