C# 有没有人知道从2的0次方到2的9次方的和有多少种组合?又或者……
有没有人知道从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
我说明白了吗?
[解决办法]
2^9 - 1种,如果至少要选1个的话
[解决办法]
这不就是一个排列组合的问题吗 一共是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];*/
}
[解决办法]
先给枚举打上个[Flags]标记,然后就可以使用Enum类的HasFlag来判定是否标记某个特定的位。
比如控件chkDoc是一个CheckBox,那么可以
chkDoc.Checked = ((FileType)FTValue).HasFlag(FileType.doc);
[解决办法]
和排列组合有个p关系, 这是最基础的“位运算”
每个文件类型实际上就占据了一个标志位而已
在 c 或者 c++ 当中
if ( flag & xml ) SendXmlFile;
if ( flag & eml ) SendEmlFile;
别的语言也都有类似的位运算操作
[解决办法]
补充1#
[Flags]
public enum FileType : int
FileType FTvalue = FileType.A
[解决办法]
FileType.B
[解决办法]
...
if ((FTvalue & FileType.A) != 0)