C#排列数字组合方法

因一时兴趣为了计算福利彩票的排列数中奖概率,故写了以下排列数方法。有错误的地方请指正。

使用方法:

基数35个数,创建七位数组合

List<int[]> list = Arrange_Recursion(7, 0, new List<int[]>());

一共6724520种 用时 4821.1298 毫秒

        /// <summary>
        /// 使用递归创建 组合数排列
        /// </summary>
        /// <param name="combinationNum">组合数</param>
        /// <param name="StartNum">开始数 从0开始</param>
        /// <param name="finalList">最终排列 数组</param>
        /// <returns></returns>
        public List<int[]> Arrange_Recursion(int combinationNum, int StartNum, List<int[]> finalList)
        {

            StartNum++;
            if (StartNum != combinationNum)
            {

                int[] arr = CreterArray(35);
                List<int[]> list = CreterArrange(finalList, arr);
                return Arrange_Recursion(combinationNum, StartNum, list);

            }
            else {
                return finalList;
            }
        }

        /// <summary>
        /// 创建排列
        /// </summary>
        /// <param name="finalList"></param>
        /// <param name="arr"></param>
        /// <returns></returns>
        private static List<int[]> CreterArrange(List<int[]> finalList, int[] arr)
        {
            List<int[]> list = new List<int[]>();
            if (finalList.Count != 0)
            {
                foreach (int[] arr_ints in finalList)
                {
                    foreach (int s2 in arr)
                    {
                        if (arr_ints[arr_ints.Length - 1] < s2)
                        {
                            int[] nArr = { s2 };
                            list.Add(arr_ints.Concat(nArr).ToArray());
                        }
                    }
                }
            }
            else
            {
                //初始化数组 最低2个组合排列
                foreach (int s1 in arr)
                {
                    foreach (int s2 in arr)
                    {
                        if (s2 > s1)
                        {
                            int[] nArr = { s1, s2 };
                            list.Add(nArr);
                        }
                    }
                }
            }

            return list;
        }

        /// <summary>
        /// 创建多少位数组
        /// </summary>
        /// <param name="arr_length">数组长度</param>
        /// <returns></returns>
        private static int[] CreterArray(int arr_length)
        {

            int[] arr = new int[arr_length];
            for (int i = 1; i <= arr_length; i++)
            {
                arr[i - 1] = i;
            }

            return arr;
        }

 

posted @ 2020-01-09 14:30  哈佛  阅读(1319)  评论(0编辑  收藏  举报