我需要生成大小完全等于8的完整标记集。令牌中的每个位都可以假设来自0 - 9
和A -Z
的值。例如 -
以下是有效令牌: 00000000 0000000A 000000H1 Z00000XA
所以基本上我想生成从00000000到ZZZZZZZZ的所有标记。 我如何在C
中做到这一点答案 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的输出。或者,您可以为数字使用较小的字符集。理想情况下,LEN
和digs
都应该是命令行参数而不是常量,但我已经花了太多时间在这上面。
修改强>
好的,我骗了。显然我没有花太多时间在这上面,因为我已经清理了一个小错误(第一个字符串没有正确显示,因为我在显示之前进行了更新)并且我已经制作了长度和字符集命令行输入。
请注意,此代码假定为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'结尾