如何生成长度恰好等于8的所有令牌集

时间:2015-06-02 16:37:30

标签: c algorithm combinations

我需要生成大小完全等于8的完整标记集。令牌中的每个位都可以假设来自0 - 9A -Z的值。例如 -

以下是有效令牌: 00000000 0000000A 000000H1 Z00000XA

所以基本上我想生成从00000000到ZZZZZZZZ的所有标记。 我如何在C

中做到这一点

2 个答案:

答案 0 :(得分:0)

这里根本不需要递归或嵌套循环。

您只需要一个0到36 8 -1的计数器,然后将结果转换为基数36的输出。

也就是说,36个 8 字符串,每个字符串长度为8个字节,是22,568,879,259,648字节,或大约20.5太字节的数据。

假设每秒100兆字节的持续速率,将所有数据写入某些硬盘驱动器大约需要63个小时。

答案 1 :(得分:0)

你抓住我的那天我不想做我应该做的事情 1

以下代码仅生成令牌输出;它不会尝试在任何地方存储令牌。您可以将输出重定向到文件,但正如其他人指出的那样,您将需要一个更大的 boat 硬盘来存储36个 8 字符串。在没有嵌套循环的情况下,可能有一种方法可以做到这一点,但这种方法非常简单。第一个循环更新每个位置的计数器,而第二个循环将计数器映射到符号并将符号写入标准输出。

您可以将LEN设置为较小的值(如3),以验证程序是否符合您的要求,而不会产生数TB的输出。或者,您可以为数字使用较小的字符集。理想情况下,LENdigs都应该是命令行参数而不是常量,但我已经花了太多时间在这上面。

修改

好的,我骗了。显然我没有花太多时间在这上面,因为我已经清理了一个小错误(第一个字符串没有正确显示,因为我在显示之前进行了更新)并且我已经制作了长度和字符集命令行输入。

请注意,此代码假定为C99。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define DEFAULT_LEN 8

int main( int argc, char **argv )
{
  const char *default_digs="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  size_t len = DEFAULT_LEN;
  const char *digs = default_digs;

  if ( argc > 2 )
    digs = argv[2];

  if ( argc > 1 )
    len = strtoul( argv[1], NULL, 10 );

  int idx[len];
  memset( idx, 0, sizeof idx );

  size_t diglen = strlen( digs );

  for(;;)
  {
    int j = len;
    while( j )
      putchar( digs[idx[--j]] );

    putchar( '\n' );

    while ( j < len && idx[j] == diglen - 1 )
      idx[j++] = 0;

    if ( j == len )
      break;

    idx[j]++;
  }

  return 0;
}

示例输出:

[fbgo448@n9dvap997]~/prototypes/tokgen: ./tokgen 2 01
00
01
10
11

[fbgo448@n9dvap997]~/prototypes/tokgen: ./tokgen 3 01
000
001
010
011
100
101
110
111

[fbgo448@n9dvap997]~/prototypes/tokgen: ./tokgen 2 012
00
01
02
10
11
12
20
21
22

<小时/> 1。公平地说,几乎任何一天都以'y'结尾