呵呵,这是我第一次这么耐心帮助别人,上面的程序应该没什么问题了
发完上一面代码后才发现和8楼兄弟的算法思想相同,志同道合啊。只是让我不理解的是既然8楼想出要这么做,为什么还用了一段排序,还是冒泡这种排序算法里效率最差的?而你数组a里数字的顺序恰好是所求Q的各位数字的倒序,为什么不在一开始就把顺序排好?
其他人的代码太长,我也没去细看,下面就简要分析认证一下这一算法的正确性吧。
根据题目要求,Q的各位数字的乘积等于N,可以确定当N大于1时Q里不包含0和1。因为0乘以任何数得0,而1乘以任何数相当于没乘。
所以Q中只包含2到9。整个Q相当于对N进行因式分解后各因子的排列。为了使Q达到最小,那么要求将最大的因子排在权最低的位置。我想这就是各位对排序念念不忘的原因吧。
还有一点,为了使Q最小,还要尽量缩短Q的长度,也就是因子的数量。比如说因子中存在一个2和一个3,则用6代替它俩可以使Q进一步的减小。也就是说,合并其乘积小于10的因子。其实这样的可合并的情况并不多,只有2*2, 2*2*2, 2*3, 3*3这4种其值是4, 8, 6, 9。
所以,在做因式分解时只要从9到2进行偿试就可以得到可合并的最大的因子。如果当前分解尚未结束,那么下一个因子必然小于等于当前的因子。这一点可以用反证法证明,很简单,我就不在里费事了。
最后,讨论一下Q的存在性。
任何一个数字都可以表示成有限个素数的积。设将N分解成素数的积,其中最大的素数为P,则只要P<10,Q就存在,否则不存在与N对应的Q。理由及其证明很简单,我就不多说了。
以上就是我上面算法的理论基础。各位还有什么高见在下敬候,可以开拓一下思路