首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

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

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

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)

[解决办法]
你的问题与这个帖子类似,可以看一下9,13,16楼。http://topic.csdn.net/u/20120804/19/af4e819c-b798-4621-8089-40bd56df30bd.html

热点排行