蓝桥杯-带分数
分析
参考文献 qingdujun的博客
先说一下自己的思路,数字1-9只能出现一次,所以可以先将1-9进行全排列,然后划分整数,分子和分母。
然后问题就来了,之前写过一道全排列,当时是用了N重for循环嵌套,想想都觉得恶心。后来在网上看大神的解法,可以用字典序或递归,觉得字典序比较复杂,就只看了递归的方法,下面贴上代码。
全排列
1 | int list[9]={1,2,3,4,5,6,7,8,9}; |
划分
设d为整数部分,up为分母,down为分子,
整数部分肯定要小于你给定的待求值N,所以要先算出N的位数。
然后在范围内,再一步一步试探up,down能否满足条件N=d+up/down,
但要是遍历,肯定会超时,所以需要剪枝。这个点我就想不来了。
下面是从大神那里看到的方案
d的头部就是list[0],down的尾部是list[9]。
N=d+up/down<=>up=(N-d)down。
设up的尾部数字为 upLast, upLast = ((N-d)list[8])%10。
接着判断条件就出来了 : up%down == 0 &&
upLast == ((N-d)*list[8])%10 && N-d == up/down
完整代码
1 |
|