题目概述
一个数 n 可表示为 n = a + c / b ,其中a、b、c中数字1-9分别出现且只出现一次,统计输入值 n 的全部表示方式的数量。
题目分析
由于要求1-9每个数字都要出现一次,那很容易想到采用全排列。关键在于,对于每一种排列,该如何从中选取 a、b、c 三个数。
首先可以确定的是 a<n ,那 a>=n的情况可以一并排除,其次由于 a、b、c、n都是整数,那么 c/a 也要是整数,及 c%b=0 (在这一条件中,已经隐含了 c>=b),这样一来结合剪枝,就能很容易得到答案。
完整代码
1 |
|
自我总结
碰到好几个坑,能反应出不少知识体系和做题思路的问题:
- 原本把
a=a*10+nums[i]
写成了a*=10+nums[i]
,以为这两者没有区别,但实际上后者等同于a=a*(10+nums[i])
,*=
的优先级比较低。 - 由于 c>b 的一个充分条件是 c 的长度大于 b ,所以一开始直接在迭代 c 的代码中直接让 c 的长度大于 b ,及写成了
for(int j=i+ceil((9+i)/2.0); j<9; j++)
,但过多的条件使得结果出现了错误。在能选择简单明了的情况下应当避免选择复杂。