【发布时间】:2018-10-28 15:41:39
【问题描述】:
我们从用户那里得到非负整数n,我们必须打印集合({1,2,3,...,n})的所有子集。 (n<=20)
例如对于n=3,我们必须打印:
{1 , 2 , 3}
{1 , 2}
{1 , 3}
{1}
{2 , 3}
{2}
{3}
{}
,s 是可选的,序列可以不带任何逗号打印。 (如 {1 2 3})
我必须补充一点,子集的序列必须与示例完全相同。首先是具有 1 的子集,然后是具有 2 和 ... 的子集。必须首先打印最长的子集。 (从最大子集(集合本身)到空集的字典顺序)
我在网上看到很多代码用数组或位数组来解决这个问题,指示我们是否使用数字。问题是在这个问题中,我们不允许使用任何类型的数组或其他数据结构,如向量等。即使使用类似字符串的数组行为也是完全禁止的。只能通过递归来解决。
我们也不允许使用任何高级功能。例如,如果我们用C 编写它,我们只允许使用stdio.h 或C++,只允许使用<iostream>,不允许使用其他库。
如果没有任何数组,我不知道该怎么做。如何检查它必须打印哪个号码,同时管理{}。
PS1。 问题只是具有以下条件的发电组:
完全禁止使用数组、字符串和偶数循环。只是递归。
用户 Kosyr 使用位运算符提交了一个非常好的答案。因此,如果您想提交另一个答案,请提交一个甚至不使用位运算符的答案。
PS2.
我在 George 的帮助下编写了这段代码,但它不能正常工作。它没有像 1 2 4 这样的东西。它还会重复某些情况。
#include <stdio.h>
void printAllSets (int size)
{printRows (size, 1);}
void printRows (int size , int start)
{
if (start<=size)
{printf( "{ ");
printRow (start, size);
printf ("}");
printf ("\n");}
if (start <= size)
{printRows(size -1 , start);
printRows (size , (start + 1));}
}
printRow (int start, int limit)
{
if (start <= limit)
{
printf ("%d ",start);
printRow (start +1, limit);
}
}
int main()
{
printAllSets(5);
printf("{ }");
return 0;
}
PS3.
用户 Kosyr 使用位运算符提交了一个非常好的答案。因此,如果您想提交另一个答案,请提交一个甚至不使用位运算符的答案。
【问题讨论】:
-
提示:打印所有长度为 0 的子集,然后打印所有长度为 1 的子集,以此类推,直到最后打印唯一长度为 n 的子集。
-
@thebjorn 我不知道该怎么做。我必须补充一点,子集的序列必须与示例完全相同。首先是具有 1 的子集,然后是具有 2 和 ... 的子集。必须首先打印最长的子集。不仅仅是长度为零。然后长度为 1 和 ...
-
n的最大值是多少?
标签: algorithm recursion subset powerset