Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中所有可能的组合_C_Algorithm_Combinatorics - Fatal编程技术网

C中所有可能的组合

C中所有可能的组合,c,algorithm,combinatorics,C,Algorithm,Combinatorics,我试图在C语言中找到一个有效的算法,它提供了给定字符集的所有组合 算法不应该是递归的。最后,数字的数量应该是灵活的。例如: char set[] = "a1"; -> a1 aa 1a 11 我只找到了一个Perl解决方案,但它使用了substr()。我认为这并没有那么快的表现 对于C语言中的大多数算法,我发现它们只是排列 一篇德国C++论坛的文章声称,C++ + STL解决方案比“原始”递归算法快。 < P>如果集合大小是固定的N,那么它就很简单了,你可以只为循环使用N,每个循环嵌套到

我试图在C语言中找到一个有效的算法,它提供了给定字符集的所有组合

算法不应该是递归的。最后,数字的数量应该是灵活的。例如:

char set[] = "a1";
->
a1
aa
1a
11
我只找到了一个Perl解决方案,但它使用了
substr()
。我认为这并没有那么快的表现

对于C语言中的大多数算法,我发现它们只是排列


<>一篇德国C++论坛的文章声称,C++ + STL解决方案比“原始”递归算法快。

< P>如果集合大小是固定的N,那么它就很简单了,你可以只为循环使用N<代码>,每个循环嵌套到前一个。因为不能这样做,也不能使用递归,所以必须计算所需的总迭代次数(似乎是N^M),使用一个循环,然后使用/和%来计算每个字符的数组索引。你最好也使用long,因为N^M很快变大。

如果设置的大小是一个固定的N,那就很简单了-你可以让N
用于
循环,每个循环嵌套在前一个循环中。因为不能这样做,也不能使用递归,所以必须计算所需的总迭代次数(似乎是N^M),使用一个循环,然后使用/和%来计算每个字符的数组索引。你最好也使用long,因为N^M很快变大。

好吧,我会给可能的组合编号,循环编号并转换

例如:要生成10个符号{'0'、'1'、…、'9'}的所有大小为3的组合,我将从0循环到999,并输出“000”到“999”


同样地,为了生成5个符号{'a'、'b'、…、'e'}的所有大小为3的组合,我将从0循环到5*5*5-1,并以5为基数输出循环编号,但使用提供的符号。

好的,我将对可能的组合编号,循环编号并转换

例如:要生成10个符号{'0'、'1'、…、'9'}的所有大小为3的组合,我将从0循环到999,并输出“000”到“999”


以同样的方式(类似),要生成5个符号{'a'、'b'、…、'e'}的所有大小为3的组合,我将从0循环到5*5*5-1,并以5为基数输出循环数,但使用提供的符号。

Python非常接近于伪代码

您可以将Python源代码读取到C中,然后用C进行复制

以下是此功能的演示:

#!/usr/bin/env python
import itertools

s='a1'

print set(itertools.permutations(s*len(s), len(s)))
输出:

set([('1', '1'), ('a', '1'), ('a', 'a'), ('1', 'a')])
这里有一个更简单的方法:

>>> s='a1'
>>> ['{}{}'.format(x,y) for x in s for y in s]
['aa', 'a1', '1a', '11']


>>> s='abc'
>>> ['{}{}{}'.format(x,y,z) for x in s for y in s for z in s]
['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 
 'acc', 'baa', 'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 
 'bcb', 'bcc', 'caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 
 'cca', 'ccb', 'ccc']
要展开列表,请使用嵌套循环,如下所示:

>>> for x in s:
...    for y in s:
...       for z in s:
...          print '{}{}{}'.format(x,y,z)

Python非常接近于伪代码

您可以将Python源代码读取到C中,然后用C进行复制

以下是此功能的演示:

#!/usr/bin/env python
import itertools

s='a1'

print set(itertools.permutations(s*len(s), len(s)))
输出:

set([('1', '1'), ('a', '1'), ('a', 'a'), ('1', 'a')])
这里有一个更简单的方法:

>>> s='a1'
>>> ['{}{}'.format(x,y) for x in s for y in s]
['aa', 'a1', '1a', '11']


>>> s='abc'
>>> ['{}{}{}'.format(x,y,z) for x in s for y in s for z in s]
['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 
 'acc', 'baa', 'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 
 'bcb', 'bcc', 'caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 
 'cca', 'ccb', 'ccc']
要展开列表,请使用嵌套循环,如下所示:

>>> for x in s:
...    for y in s:
...       for z in s:
...          print '{}{}{}'.format(x,y,z)

编写一个函数,将整数转换为字符串十六进制数,然后将该算法转换为基数为36(a-z加0-9)的数字。使用一个for循环从1计数到(数字计数乘以基数),并每次调用您的函数

  • 1变为1
  • 10成为一个
  • 35变成z
  • 36变成10
  • 46变成1a

编写一个函数,将整数转换为字符串十六进制数,然后将该算法转换为基数为36(a-z加0-9)的数字。使用一个for循环从1计数到(数字计数乘以基数),并每次调用您的函数

  • 1变为1
  • 10成为一个
  • 35变成z
  • 36变成10
  • 46变成1a

维基百科有一个C代码来表示。通过使用数字作为输入数组的偏移量,它应该可以转换为您的问题。您需要执行一些动态分配来处理输入的任意长度。一种相关的方法是执行嵌套循环,其中有一个循环计数器数组,长度与输入相同,另一个计数器当前正在递增。例如,打印所有以六位数为基数的六位数字时,需要进行修改以实现动态分配,但显示了以下原则:

int i;
int length = 5;
int max = 6;
int counters[length];
for (i=0; i<length; i++)
    counters[i] = 0;
for(;;) {
    for (i=length-1; i>=0; i--)
        printf("%d", counters[i]);
    printf("\n");
    for(i=0; i<length; i++) {
        counters[i]++;
        if (counters[i] < max)
            break;
        else
            counters[i] = 0;
    }
    if (i >= length)
        break;
}
inti;
整数长度=5;
int max=6;
整数计数器[长度];
对于(i=0;i=0;i--)
printf(“%d”,计数器[i]);
printf(“\n”);
对于(i=0;i=长度)
打破
}

维基百科有C代码用于。通过使用数字作为输入数组的偏移量,它应该可以转换为您的问题。您需要执行一些动态分配来处理输入的任意长度。一种相关的方法是执行嵌套循环,其中有一个循环计数器数组,长度与输入相同,另一个计数器当前正在递增。例如,打印所有以六位数为基数的六位数字时,需要进行修改以实现动态分配,但显示了以下原则:

int i;
int length = 5;
int max = 6;
int counters[length];
for (i=0; i<length; i++)
    counters[i] = 0;
for(;;) {
    for (i=length-1; i>=0; i--)
        printf("%d", counters[i]);
    printf("\n");
    for(i=0; i<length; i++) {
        counters[i]++;
        if (counters[i] < max)
            break;
        else
            counters[i] = 0;
    }
    if (i >= length)
        break;
}
inti;
整数长度=5;
int max=6;
整数计数器[长度];
对于(i=0;i=0;i--)
printf(“%d”,计数器[i]);
printf(“\n”);
对于(i=0;i=长度)
打破
}

为什么它不应该是递归的?这听起来像是人为的限制,通常是出于家庭作业的原因a1 aa 1a 11。为什么不AAA、AA1、A1A、A11、1AA、1A1、11A和111?一些问题:为什么C++标签?字符集是否包含重复字符,如果是,应该如何处理?我删除了C++,因为他明确地要求C和增加的作业,对一些平凡的事情有太多的限制而不是家庭作业。我想如果你真的想要一个快速的解决方案,你可以给我你的教授的电子邮件,我可以把我的代码发给他,上面写着你的名字……为什么不应该是递归的呢?这听起来像是人为的限制,通常是出于家庭作业的原因a1 aa 1a 11。为什么不AAA、AA1、A1A、A11、1AA、1A1、11A和111?一些问题:为什么C++标签?字符集是否包含重复字符,如果是,应该如何处理?我删除了C++,因为他明确地要求C和