日期:2014-05-18  浏览次数:20998 次

打印双色球所有排列组合的个数,结果与理论计算不一致?
算法是我的弱项呵呵,偶尔想研究一下:双色球的排列组合个数应该是:
((33 * 32 * 31 * 30 * 29 * 28) / (2 * 3 * 4 * 5 * 6)) * 16 = 17721088

而我想写程序穷尽一下所有的组合 结果却是:230153616 整整多出了13倍!!!!!! 不知道我哪里有重复的? 该怎么修改?(双色球规矩:6个 红球号码: 1-33不管顺序 + 一个篮球号码 1-16 )
代码如下:
C# code


        static void Main(string[] args)
        {
            int length = ((33 * 32 * 31 * 30 * 29 * 28) / (2 * 3 * 4 * 5 * 6)) * 16;
            Console.WriteLine(length);
            byte[] byteData = new byte[12 * 100];
            int id = 0;
                for (int r1 = 1; r1 <= 33; r1++)
                {
                    for (int r2 = 1; r2 <= 33; r2++)
                    {
                        for (int r3 = r2; r3 <= 33; r3++)
                        {
                            for (int r4 = r3; r4 <= 33; r4++)
                            {
                                for (int r5 = r4; r5 <= 33; r5++)
                                {
                                    for (int r6 = r5; r6 <= 33; r6++)
                                    {
                                        for (int bl = 1; bl <= 16; bl++)
                                        {
                                            id++;
                                            //if ((id % 100000) == 0)
                                            //{
                                            //    Console.WriteLine(" {0} ", ((int)id)/100000);
                                            //}                                                                  
                                        }
                                    }
                                }
                            }
                        }
                    }
                }


                Console.WriteLine("OVER! id = {0} length = {1}", id, length);
            Console.ReadKey();
        }



------解决方案--------------------
for循环的起始条件应该是r2=r1+1,r3=r2+1....,否则r[k+1]和r[k]就重复了