题目描述
思路
n = a + b / c等价于n * c = a * c + b
首先求出1~9的全排列,对于每一种排列情况,用两个指针i和j划分出a, b,c,判断是否满足n * c = a * c + b
#include <iostream>
using namespace std;
const int N = 15;
int num[N]; //存储全排列的情况
bool vis[N];
int n, res; //res为最终答案
int cal(int l, int r) //返回值为num[l~r]所对应的数字
{
int temp = 0;
for(int i = r; i >= l; i --) temp = temp * 10 + num[i];
return temp;
}
void dfs(int idx) // idx表示当前已经选了idx + 1个数
{
if(idx == 9) //已经选了10个数
{
for(int i = 0; i < 7; i ++) //枚举b的起始位置, 注意这里需要将c的位置留出来,至少是一位数
{
for(int j = i + 1; j < 8; j ++) //枚举c的起始位置
{
int a = cal(0, i);
int b = cal(i + 1, j);
int c = cal(j + 1, 8);
if(n * c == a * c + b) res ++;
}
}
}
for(int i = 1; i <= 9; i ++) //全排列
{
if(!vis[i])
{
vis[i] = true;
num[idx] = i;
dfs(idx + 1);
vis[i] = false;
}
}
}
int main()
{
cin >> n;
dfs(0);
cout << res;
return 0;
}
欢迎大家批评指正!!!