题目连接
思路
由1 - 9组成带分数,因为每个数只能出现一次,所以就枚举出1 - 9的全排列,然后把它分为三个部分,用双重循环考虑所有情况,最后算出结果即可。
代码
cpp
#include <bits/stdc++.h>
using namespace std;
const int N = 100;
int ans[N]; //记录全排列结果
bool f[N];
int n, res = 0;
void dfs(int u)
{
//如果到了第十个数,就可以开始计算,并返回
if (u > 9)
{
// for (int i = 1; i <= 9; i ++ )
// {
// cout << ans[i] << " ";
// }
// cout << endl;
//枚举整数部分的位数
for (int i = 1; i <= 7; i ++ )
{
//枚举分子部分的位数
for (int j = 1; j <= 8 - i; j ++ )
{
//算出分子的位数
int k = 9 - i - j;
//记录每一部分的数值
int a = 0, b = 0, c = 0;
//算出整数部分
for (int f = 1; f <= i; f ++ )
{
a = a * 10 + ans[f];
}
//算出分子部分
for (int f = i + 1; f <= i + j; f ++ )
{
b = b * 10 + ans[f];
}
//算出分母部分
for (int f = i + j + 1; f <= 9; f ++ )
{
c = c * 10 + ans[f];
}
// cout << a << " " << b << " " << c << endl;
if (b % c == 0 && a + b / c == n)
{
res ++;
}
}
}
}
//枚举9个数
for (int i = 1; i <= 9; i ++ )
{
//如果当前数没被选过
if (!f[i])
{
f[i] = 1; //标记为选过
ans[u] = i; //记录该数
dfs(u + 1); //进入下一个位置
f[i] = 0; //标记为未选过
}
}
}
int main()
{
cin >> n;
dfs(1);
cout << res;
return 0;
}
总结
不是很难