下面这个程序是做什么用的呢.注释下吧

xiao_xiao_zi 2009-09-09 09:19:03
///输出集合的所有子集合:利用二进制数表示法解决
void Allchildset(char *s,int n)
{
int i,j,max=pow(2,n);
for(i=0;i<max;i++)
{
for(j=0;j<n;j++)
if(i & (int)pow(2,j))
cout<<s[j];
cout<<" ";
}

}
...全文
61 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hemy818 2009-09-09
  • 打赏
  • 举报
回复
这是个NP问题, 目前没有高效的算法来求解
cphj 2009-09-09
  • 打赏
  • 举报
回复
输出集合的所有子集合:
例如集合abc的话,这样调用
char * s = "abc";
Allchildset(s, 3);
结果输出a b ab c ac bc abc
whg01 2009-09-09
  • 打赏
  • 举报
回复
pow(2,j) = 1 << j
函数的功能:挨个判断从0到pow(2,n)的所有数i,如果i的第j个bit为1,则输出s[j],否则输出空格。
hemy818 2009-09-09
  • 打赏
  • 举报
回复

#include <stdio.h>
int main()
{

int a[3] = {1,2,3}, b[3] = {0};
int i, j;

for(i = 0; i < 7; i++) // 2^n-1
{
b[0]++;
j = 0;
while (b[j] > 1 )
{
b[j] = 0;
j++;
b[j]++;
}

for (j = 0; j < 3; j++)
{
if (b[j])
printf("%d ", a[j]);
}
printf("\n");
}

return 0;

}

hemy818 2009-09-09
  • 打赏
  • 举报
回复
可以用 二进制加法来标记数组的状态位
这样简单易懂
晨星 2009-09-09
  • 打赏
  • 举报
回复
在一个集合的某个子集中,某个元素要么存在,要么不存在,只有这两种情况。所以,每一个元素都可用二进制的一个位来表示。
于是,对于有N个元素的集合,依次遍历N个bit的所有可能的值,就等于输出了它的所有子集。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧