让你失望了,这个算法不是我想出来的。我也很佩服想出来这个算法的人。
个人觉得这道题目很没有意思(这时候,“不告诉你”跳出来说,这道题明明很好的嘛!)。从算法推测:
从这个数的的两个数的因式入手,例如24=2*12=3*8=4*6=6*4=8*3=12*2=24*1,如果2 可以被24整除,24的sets个数就会比原来24的sets数多出24/2=12的sets个数,但这时12的sets个数没有被完全算出来,仍然是0,所以24 的sets数是0;当发现3 能被24整除时,24的个数又增加了此时8的sets数,是1,而此时 8 的sets数是一,表示的是8=2*2*2,所以24=3*2*2*2这个set被计算了。当程序发现4可以被24整除时,找6,6=2*3在3能被6整除时已经成为1了,所以24=4*2*3这个set被计算在内了。到这是没有结束,24=4*6=6*4被认为是不一样的。6能被24整除,且此时4的sets已经被算出来了,4=2*2=4*1,所以24=6*2*2=6*4被考虑在内了,这时24的个数为4个了……以此分析可以发现24的所以因式可以不重不漏地考虑在内。以下是算出24的sets的intermedia results。当i=2是,2的所有sets数必然会被算出,i=n是,n的sets数也会被算出来,……
i=2 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
i=3 0 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1
i=4 0 1 1 1 2 0 1 0 2 1 0 0 2 0 0 0 3 0 1 0 0 0 0 0 2
i=5 0 1 1 1 2 1 1 0 2 1 1 0 2 0 0 1 3 0 1 0 2 0 0 0 2
i=6 0 1 1 1 2 1 2 0 2 1 1 0 3 0 0 1 3 0 2 0 2 0 0 0 4
i=7 0 1 1 1 2 1 2 1 2 1 1 0 3 0 1 1 3 0 2 0 2 1 0 0 4
i=8 0 1 1 1 2 1 2 1 3 1 1 0 3 0 1 1 4 0 2 0 2 1 0 0 5
i=9 0 1 1 1 2 1 2 1 3 2 1 0 3 0 1 1 4 0 3 0 2 1 0 0 5
i=10 0 1 1 1 2 1 2 1 3 2 2 0 3 0 1 1 4 0 3 0 3 1 0 0 5
i=11 0 1 1 1 2 1 2 1 3 2 2 1 3 0 1 1 4 0 3 0 3 1 1 0 5
i=12 0 1 1 1 2 1 2 1 3 2 2 1 4 0 1 1 4 0 3 0 3 1 1 0 6
i=13 0 1 1 1 2 1 2 1 3 2 2 1 4 1 1 1 4 0 3 0 3 1 1 0 6
i=14 0 1 1 1 2 1 2 1 3 2 2 1 4 1 2 1 4 0 3 0 3 1 1 0 6
i=15 0 1 1 1 2 1 2 1 3 2 2 1 4 1 2 2 4 0 3 0 3 1 1 0 6
i=16 0 1 1 1 2 1 2 1 3 2 2 1 4 1 2 2 5 0 3 0 3 1 1 0 6
i=17 0 1 1 1 2 1 2 1 3 2 2 1 4 1 2 2 5 1 3 0 3 1 1 0 6
i=18 0 1 1 1 2 1 2 1 3 2 2 1 4 1 2 2 5 1 4 0 3 1 1 0 6
i=19 0 1 1 1 2 1 2 1 3 2 2 1 4 1 2 2 5 1 4 1 3 1 1 0 6
i=20 0 1 1 1 2 1 2 1 3 2 2 1 4 1 2 2 5 1 4 1 4 1 1 0 6
i=21 0 1 1 1 2 1 2 1 3 2 2 1 4 1 2 2 5 1 4 1 4 2 1 0 6
i=22 0 1 1 1 2 1 2 1 3 2 2 1 4 1 2 2 5 1 4 1 4 2 2 0 6
i=23 0 1 1 1 2 1 2 1 3 2 2 1 4 1 2 2 5 1 4 1 4 2 2 1 6
i=24 0 1 1 1 2 1 2 1 3 2 2 1 4 1 2 2 5 1 4 1 4 2 2 1 7
其实我只是(不完全)证明了这个算法的正确性,怎么想的,还是问“不告诉你”吧。:D
我个人有个算法,recursive的算法,速度不够快,会超时,所以不介绍了……