带分数(暴力枚举全排列)
直接暴力枚举全排列九位数,再将排列结果分割为a、b、c三份,找符合条件的结果
C++ 代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 10;
int target;//目标数
int used[N];//数字使用状态
int state[N];//排列状态
int cnt;//几种结果
//排列数化为数学大小数
int cal(int l ,int r) {
int res = 0;//储存结果
for (int i = l; i <= r; i++) {
res = res * 10 + state[i];//化为数
}
return res;
}
void dfs(int u) {
//边界
if (u == 9 + 1) {
int a, b, c;
//划分a、b、c
for (int l = 1; l <= 8; l++) //第一个划分,得到a
{
for (int r = l + 1; r <= 9; r++)//第二个划分,得到b、c
{
a = cal(1, l);//第一个划分,得到a
b = cal(l + 1, r);//第二个划分,得到b
c = cal(r + 1, 9);//得到c
//因为C++整除会自动取整,所以改为乘
if (target * c == a * c + b) {
cnt++;//若符合条件,表达法+1
}
}
}
return;
}
//枚举全排列9位数
for (int i = 1; i <= 9; i++) {
if (!used[i]) {
state[u] = i;//排列
used[i] = true;
dfs(u + 1);
state[u] = 0;//恢复现场
used[i] = false;
}
}
}
//暴力枚举全排列,再分a、b、c三个数的位数,找出符合条件的
int main() {
/*scanf("%d", &target);*/
cin >> target;
dfs(1);
printf("%d", cnt);//注意cnt不是地址,不使用&
return 0;
}