Шаблоны в двоичных числах - PullRequest
0 голосов
/ 22 октября 2009

Рассмотрим n-битное двоичное число в следующей форме:

б * +1004 * п-1 B п-2 B п-3 ... * 1010 б * 0

Каждый b i представляет собой один бит в n-битном двоичном числе. Каждый b i имеет одно из двух возможных значений: 0 или 1. Пример 6-разрядного двоичного числа: 110011. Внутри компьютера целые числа представлены в виде двоичных чисел. Например, целое число 43 может быть представлено 6-битным двоичным числом: 101011. В этой части мы будем использовать m-битный двоичный шаблон, который создается путем взятия первых m-битов повторяющейся последовательности 101010. , , , Например, для m, равного 3, двоичный шаблон: 101. Для m, равного 6, двоичный шаблон: 101010. Для m, равного 1, двоичный шаблон: 1.

Напишите программу на C, которая читает целые числа n и m в качестве входных данных, а затем распечатывает все n-битные двоичные числа, которые содержат m-битную комбинацию. Двоичные числа должны быть напечатаны в порядке возрастания. Вы не можете использовать строки, массивы или рекурсию для этого вопроса. Любая программа, использующая строки, массивы или рекурсию, получит оценку 0. Ваша программа может предположить, что n будет натуральным числом, меньшим или равным 30, и m будет натуральным числом, меньшим или равным n.

Пример вывода для этой программы:

Введите целое число n: (5)
Введите целое число m: (3)
00101
01010
01011
01101
10100
10101
10110
10111
11010
11011
11101

Я новичок в программировании, и я получил это задание. Я понимаю, как программа будет работать, но я не слишком уверен, как это сделать. Может ли кто-нибудь помочь мне и опубликовать решение этого, чтобы я мог пройти через это и посмотреть, как это работает. Спасибо

Ответы [ 3 ]

10 голосов
/ 22 октября 2009

Как запрограммировать, двухэтапный процесс:

  1. Решите проблему самостоятельно.
  2. Заставь компьютер делать то, что сделал ты.

Вы должны как минимум опубликовать свое "Я понимаю, как проблема будет работать", чтобы вы могли ориентироваться на "как это сделать".


Я сделаю вид, что пока не знаю Си.

J

f=:4 :'#:(#~([:+./(#.y$1 0)=(2^y)|<.@-:^:(i.x))"0)i.2^x'

Haskell

f n m = filter bits [0..1^n-1] where
    p = foldl ((+).(*)2) 0 $ take m $ cycle [1,0]
    bits = elem p . map (`mod` 2^m) . takeWhile (/= 0) . iterate (`div` 2)
1 голос
/ 22 октября 2009

Выясните, что представляет собой значение М с повторяющейся последовательностью. (например, 3 = 101) Отрежьте хвостовую часть числа, которое вы тестируете, по одному шагу за раз с помощью x / 2 или x >> 1 и посмотрите, соответствует ли длина остатка, которую вы заботите (тест% (1 << m) == 101) </p>

Редактировать: В Python ...

binary = lambda i, c = (lambda i, c: i and (c(i >> 1, c) + str(i & 1)) or ''): c(i, c)
def SilentsHomework(M, N):
 count, base = 0, int(''.join([str([0,1,0][(-1)**x]) for x in xrange(N)]),2)>>(N-M)
 for i in xrange(1,1<<N):
  orig_i_nal = i
  while i:
   if i%(1<<M)==base: count += 1; print binary(orig_i_nal); break
   else: i >>= 1

Струны, проверьте. Массивы, проверьте. Рекурсия, нету :(

0 голосов
/ 23 октября 2009

Я могу дать вам несколько подсказок. Только подсказки. Потому что ответы на все домашние задания будут как у девушки в бикини. Вы должны много угадывать.

Чтобы сгенерировать битовую комбинацию m, используйте цикл, начинающийся с 0 до m.

for( i = 1; i <= m; i++)
{
    Pattern = ( Pattern * 2 ) + ( i % 2 )
}

Чтобы сгенерировать n битов в порядке возрастания, вы должны написать цикл, начинающийся с 1 до 2 ^ n.

for( i = 1; i < pow( 2, n ); i++ )

Следующий шаг - проверить, присутствует ли Pattern в i. Эта ТАКИЕ статья поможет вам в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...