C# 有没有人知道从2的0次方到2的9次方的和有多少种组合?又或者……

lisa9342 2012-08-30 10:46:18
有没有人知道从2的0次方到2的9次方的和有多少种组合?
如:7=1+2+4;19=1+2+6;27=1+2+8+16……

又或者有没有人有办法帮我解决下面这个问题:

我定义了一个枚举类:public enum FileType : int
{
xml = 1,
eml = 2,
doc = 4,
docx = 8,
xls =16,
xlsx = 32,
txt = 64,
pdf = 128,
rar = 256,
zip = 512,
}
程序监控一个指定目录,用户来选择该目录需要发送的文件类型,选中的类型会被发送(有可能是多选),其他类型文件程序不会动。

界面上用了十个checkbox,又定义了 int FTvalue = 0;//配置文件中存储文件类型选择结果的值
int xmlValue = 0; //未选中时为0,选中时为(int)FileType.xml
int emlValue = 0;
int docValue = 0;
int docxValue = 0;
int xlsValue = 0;
int xlsxValue = 0;
int txtValue = 0;
int pdfValue = 0;
int rarValue = 0;
int zipValue = 0;

FTvalue为上面十个变量的和,我现在的问题是,如何由FTvalue的值来判断哪些checkbox被选中了,或者说用户需要发送哪些类型,然后直接决定发送与不发送。而不是去统计这十个checkbox的checkstate

我说明白了吗?
...全文
1691 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lizhibin11 2012-08-30
  • 打赏
  • 举报
回复
你的问题与这个帖子类似,可以看一下9,13,16楼。http://topic.csdn.net/u/20120804/19/af4e819c-b798-4621-8089-40bd56df30bd.html
showjim 2012-08-30
  • 打赏
  • 举报
回复
补充1#

[Flags]
public enum FileType : int

FileType FTvalue = FileType.A | FileType.B | ...

if ((FTvalue & FileType.A) != 0)
寻开心 2012-08-30
  • 打赏
  • 举报
回复
和排列组合有个p关系, 这是最基础的“位运算”
每个文件类型实际上就占据了一个标志位而已
在 c 或者 c++ 当中
if ( flag & xml ) SendXmlFile;
if ( flag & eml ) SendEmlFile;

别的语言也都有类似的位运算操作
iyomumx 2012-08-30
  • 打赏
  • 举报
回复
先给枚举打上个[Flags]标记,然后就可以使用Enum类的HasFlag来判定是否标记某个特定的位。
比如控件chkDoc是一个CheckBox,那么可以
chkDoc.Checked = ((FileType)FTValue).HasFlag(FileType.doc);
审什 2012-08-30
  • 打赏
  • 举报
回复
这不就是一个排列组合的问题吗 一共是10个数 组合就是C10 0 C10 1 C10 2一直加到C10 10
学过高中数学的我们都知道问题的答案是2的10次方 给你说个方法 穷举所有结果
一个嵌套的FOR循环就可以了,当然你也可以采用递归的思想 最近刚写一个比你这个复杂点的算法 下面的几行是添加数据信息的 你这个只有数据下面的可以忽略。

for (int i = 1; i < 1 << x; i++)//从1循环到2^N
{
int sum = 0;
string temp = "";
for ( int j = 0; j < x; j++)
{

if ((i & 1 << j) != 0)//用i与2^j进行位与运算,若结果不为0,则表示第j位不为0,从数组中取出第j个数
{
sum += strClass[j].Price;
temp += strClass[j].Id.ToString() + " " + strClass[j].BookName + " " + strClass[j].BookClass + " " + strClass[j].Price.ToString() + " ";

}
}
if (sum == Int32.Parse(textBox.Text))
{
// MessageBox.Show(temp.TrimEnd('+'));//如果和为所求,则输出
string[] row = temp.Split(' ');
int n = row.Length / 4;
for (int m = 0; m < n; m++)
{

listView.Items.Add(new ListViewItem(new string[] { row[0 + m * 4], row[1 + m * 4], row[2 + m * 4], row[3 + m * 4] }));

/*listView.Items.Add(row[0 + m * 4]);
listView.Items.Add(row[1 + m * 4]);
listView.Items.Add(row[2 + m * 4]);
listView.Items.Add(row[3 + m * 4]);*/
/*listView.Items[m].SubItems[0].Text = row[0 + m * 4];
listView.Items[m].SubItems[1].Text = row[1 + m * 4];
listView.Items[m].SubItems[2].Text = row[2 + m * 4];
listView.Items[m].SubItems[3].Text = row[3 + m * 4];*/
}
lisa9342 2012-08-30
  • 打赏
  • 举报
回复
在线等呢,大家帮帮忙啦!出出主意嘛!
lisa9342 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
2^9 - 1种,如果至少要选1个的话
[/Quote]1023种?那有没有组合表可以看,要我自己列出来实在是太费事了
绿色夹克衫 2012-08-30
  • 打赏
  • 举报
回复
2^9 - 1种,如果至少要选1个的话

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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