题目出处:带分数
这道题本来应该很简单的一个搜索,我用Java写总是超时,没办法,用C++重写了一遍AC了。里面有一点需要注意的是,分子的长度一定不会小于分母,不然就不能够整除了,有了这个剪枝,搜索的次数就少了很多。
#include <iostream>
#include <algorithm>
using namespace std;
int toDouble(int num[], int pos, int len) {
double result = 0.0;
for (int i = pos; i < pos+len; i++) {
result = result*10 + num[i];
}
return result;
}
int conbination(int num[], int n) {
int count = 0;
int len = 9;
// i, j, k分别代表a, b, c的位数, 因为后面的分数能整除,所以j肯定不能小于k
for (int i = 1; i <= 7; i++) {
// len-i 未使用的位数
for (int j = (len-i)/2; j <= len-i-1; j++) {
double a = toDouble(num, 0, i);
double b = toDouble(num, i, j);
double c = toDouble(num, i+j, len-i-j);
if (n == (a + b/c)) {
count++;
}
}
}
return count;
}
int main() {
int num[9];
bool tag[9];
for (int i = 0; i < 9; i++) {
num[i] = i+1;
tag[i] = false;
}
// cout << toDouble(num, 1, 5) << endl;
int n;
cin >> n;
int count = 0;
do {
count += conbination(num, n);
}while (next_permutation(num, num+9));
cout << count << endl;
return 0;
}