【问题标题】:Patterns in Binary Numbers二进制数中的模式
【发布时间】:2009-10-22 18:34:41
【问题描述】:

考虑以下形式的 n 位二进制数:

bn-1bn-2bn-3...b0

每个 bi 是 n 位二进制数中的一个位。每个 bi 具有以下两个可能值之一:0 或 1。6 位二进制数的示例是:110011。在计算机内部,整数表示为二进制数。例如,整数 43 可以表示为 6 位二进制数:101011。在这一部分中,我们将使用通过取重复序列 101010 的前 m 位构造的 m 位二进制模式。 . . .例如,m 等于 3,二进制模式为:101。m 等于 6,二进制模式为:101010。m 等于 1,二进制模式为:1。

编写一个 C 程序,读取整数 n 和 m 作为输入,然后打印出所有包含 m 位模式的 n 位二进制数。二进制数必须按升序打印。不允许对这个问题使用字符串、数组或递归。任何使用字符串、数组或递归的程序都将获得 0 分。您的程序可能会假设 n 将是小于或等于 30 的自然数,而 m 将是小于或等于 n 的自然数。

此程序的示例输出是:

输入一个整数 n:(5)
输入一个整数 m:(3)
00101
01010
01011
01101
10100
10101
10110
10111
11010
11011
11101

我是编程初学者,我已经完成了这项任务。我了解该程序将如何工作,但我不太确定如何进行。任何人都可以帮助我并发布解决方案,以便我可以运行它并查看它是如何工作的。谢谢

【问题讨论】:

  • 家庭作业到目前为止你有什么?作弊让你在生活中无处可去,尤其是当你将整个同上扫描到 SO 上时。
  • 左移 (
  • 如果您发布到目前为止的内容,您将获得更好的答案。简单地问别人“你能不能帮我做作业,让我看看”是不道德的。可以问“我已经走了多远,但我被困在这部分;有人可以帮我找出问题所在吗?”

标签: c binary


【解决方案1】:

如何编程,分两步:

  1. 自己解决问题。
  2. 让计算机做你做的事情。

您至少应该发布您的“我了解问题将如何解决”,以便指导您“如何解决”。


我现在要假装我不知道 C。

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 表示不理解问题;)“任何使用字符串、数组或递归的程序都将获得 0 分。”
  • 这里的代码中没有使用字符串或递归。 J 使用数组,因为否则不可能用该语言编写任何重要的东西,而且我声称 Haskell 中的列表不是数组:)
  • 实际上并没有对你投反对票 :) 很高兴你是这个问题的最佳答案。
【解决方案2】:

用重复序列找出 M 的值代表什么。 (例如 3 = 101)用 x/2 或 x >> 1 一次将要测试的数字的尾部剪掉,看看您关心的余数长度是否匹配。 (测试 % (1

编辑:在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

字符串,检查。数组,检查。递归,不:(

【讨论】:

    【解决方案3】:

    我可以给你一些线索。只有线索。因为所有作业的答案都会像比基尼女郎一样。你必须猜很多。

    要生成 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 中。这个SO article 将为您提供帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      • 2013-01-01
      • 2011-11-16
      • 1970-01-01
      • 2017-08-21
      • 2012-08-02
      相关资源
      最近更新 更多