【问题标题】:How to generate all possible variations with repetitions in C如何在 C 中通过重复生成所有可能的变化
【发布时间】:2010-12-02 17:16:17
【问题描述】:

我正在寻找 C 语言中的一种算法来生成所有可能的变化,这些变化具有针对集合长度和 n 个元素的重复。 例如,如果长度为 3,元素为:1、2。输出应为:

1 1 1

1 1 0

1 0 0

1 0 1

0 0 0

0 0 1

0 1 1

0 1 0

我已经在这里寻找解决方案,但我只能找到 Java 或 Python 中的实现,我不知道如何将它们重写为 C。有人可以在此处发布此问题的 C 代码吗?

【问题讨论】:

  • "我不知道如何将它们重写为 C" 我假设您的作业的目的是学习编写足够的 C 来完成这项工作。你试过什么?如果你没有足够的知识来写这个,你会如何处理你收到的代码?将其表示为您自己的?
  • @Paul:同意。 @anoob:先用英语试试。
  • "有人可以在这里发布这个问题的 C 代码吗?"不;你被要求这样做的原因是为了让你真正学到一些东西。

标签: c combinatorics variations


【解决方案1】:
void g(int l,int v,char *c)
{
    int i=v;
    if (l--==0) 
        puts(c);
    else 
        while(i)
            g(l,(c[l]='0'+--i,v),c);
}

void f(int l,int v)
{
    char c[l+2];
    g(((c[l]=13,c[l+1]=0),l),v,c);
}

int main()
{
    f(3,2);
    return 0;
}

经过测试,有效!,已更新以修复可读性问题

【讨论】:

  • 而且它工作得更好,写一个新的比调试更容易 THIS :)
  • 我可以看到有人掉线了,天哪。
  • 顺便说一句,我上次检查是在 10 多年前,也就是说,char c[l+2]; 不是标准 C。除非标准发生了变化,否则 gcc 可以让你侥幸逃脱。
  • Dima,你已经删除了我帖子的整个 pont。如果您要这样做,请完成工作并重命名变量,删除逗号表达式等。我将回滚您的更改。
【解决方案2】:

这只不过是在基数 B 中生成所有长度为 N 的数字(在你的情况下,N 是 3,B 是 2)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 2011-11-19
    • 1970-01-01
    • 2017-03-19
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多