我现在有个程序,不知道自己错在哪里,麻烦帮忙看看,输出一个集合的全部子集

xtfusljj 2008-03-16 01:50:20
#include<stdio.h>
int zuoyi(int n)
{
int i = 1;
for( ; i <= n; i++)
i = i << 1;
return i;
}
int main( )
{
int k[100];
int p = 0, q, i,j;
int n;
scanf("%d",&n);
printf("{");
p = zuoyi(n);
for( i = 1; i <= p; i++)
{
j = i;
for( q = 0; j >= 0; q ++ )
{
k[q] = j % 2;
j = j / 2;
}
for( ; q >= 0; q -- )
{
p = k[q];
p += 10 *p;
}
for( q = 0; q <= n; q ++ )
{
if( p % 10 == 1)
{
printf("%d,",n);
p = p >> 1;
}
n -- ;
}
printf("%d}", -- n);
}
}





而且,还有一个问题,我不知道怎么在执行时可以输入路径,让程序自己去打开,这样用命令行参数去写入东西,像main(int argc, *char argv[])这个搞不懂
...全文
119 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttlyfast 2008-03-17
  • 打赏
  • 举报
回复
ttlyfast 2008-03-17
  • 打赏
  • 举报
回复
野男孩 2008-03-16
  • 打赏
  • 举报
回复
解决命令行带参数处理n的方法(调用时可以这样:xxx.exe 10):


int main(int argc, char* argv[])
{
int k[100];
int p = 0, q, i,j;
int n;
if (argc == 2)
{
n = atoi(argv[1]);
}
else
scanf("%d",&n);

printf("{");
p = zuoyi(n);
......
......
}


但是我不知道你到底想干啥~
输出一个集合的全部子集,这个集合又是啥?

前面说的有个死循环,你自己看看到底想干啥,看自己明白没有。
然后就是int zuoyi(int n)那个函数一条语句就能解决了 p = (1 << n) -1;

还有就是贴代码的时候,格式化一下,大家看起来都轻松点~
星羽 2008-03-16
  • 打赏
  • 举报
回复

#include <stdio.h>

int zuoyi(int n)
{
int i = 1;
for( ; i <= n; i++)
i = i << 1;
return i;
}

int main( )
{
int k[100];
int p = 0, q, i,j;
int n;
scanf("%d",&n);
printf("{");
p = zuoyi(n);
for( i = 1; i <= p; i++)
{
j = i;
for( q = 0; j >= 0; q ++ )
{
k[q] = j % 2;
j = j / 2;

if (j == 0)
break;
}
for( ; q >= 0; q -- )
{
p = k[q];
p += 10 *p;
}
for( q = 0; q <= n; q ++ )
{
if( p % 10 == 1)
{
printf("%d,",n);
p = p >> 1;
}
n -- ;
}
printf("%d}", -- n);
}
}


冰矿 2008-03-16
  • 打赏
  • 举报
回复
看了一会儿怎么也没看懂你的程序,既然生成1,0序列了
干嘛还要乘10?,然后再取10的余数。。。
我的程序尽量按你的思路来,不过后面的变动大,因为实在看不懂,
考虑空集和全集情况。

#include <stdio.h>
#include <stdlib.h>
/*
int zuoyi(int n)
{
int i = 1;
for( ; i <= n; i++)
i = i << 1;
return i;
} */
//上面有问题,换成下面的
int zuoyi(int n)
{
int i = 1<<n;
return i-1;
}
int main()
{
int k[100];
int p = 0, q,i,j;
int n;
scanf("%d",&n);
p = zuoyi(n);
for ( i = 0; i <= p; i++ )
{
j = i;
for ( q = 0; j > 0; q++ )
{
k[q] = j%2;
j = j/2;
}
printf(" { ");
while (q--)
{
if ( k[q] ) printf("%d ",q+1);
}
printf("}\n");
}

system("PAUSE");
return 0;
}

测试
4
{ }
{ 1 }
{ 2 }
{ 2 1 }
{ 3 }
{ 3 1 }
{ 3 2 }
{ 3 2 1 }
{ 4 }
{ 4 1 }
{ 4 2 }
{ 4 2 1 }
{ 4 3 }
{ 4 3 1 }
{ 4 3 2 }
{ 4 3 2 1 }
请按任意键继续. . .
ttlyfast 2008-03-16
  • 打赏
  • 举报
回复
劫 分
yangsongli 2008-03-16
  • 打赏
  • 举报
回复
main(int argc, *char argv[])中的argc,*char argv[]是命令行参数。argc记录了用户在运行程序的命令行中输入的命令行参数的个数;参数*char argv[]指向的字符指针数组指向命令行中的各个参数。
下面的例子可以说明他们的作用:
#include <iostream>
using namespace std;
int main(int argc, char *argv[])//注意是(int argc, char *argv[])
{
cout<<"This program is"<<argv[0]<<endl;
for(int arg=1;arg<argc;arg++)
cout<<"Argument"<<arg<<":"<<argv[arg]<<endl;
return 0;
}
ryfdizuo 2008-03-16
  • 打赏
  • 举报
回复

这里是个死循环啊:
j最终一直就是0,
for( q = 0; j >= 0; q ++ )
{
k[q] = j % 2;
j = j / 2;
}

70,023

社区成员

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

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