C++
$\color{gold}{— > 蓝桥杯辅导课题解}$
算法一:
思路:
递归
$1.枚举a$
$2.枚举c$
$3.对于枚举的a,c,判断 b 是否成立$
$\color{#ff00ff}{图解分析:}$
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 20;
int n;
bool st[N], backup[N]; // backup:判重数组
int ans;
// 判断a,b,c是否符合条件
bool check(int a, int c) {
int b = n * c - a * c;
if(!a || !b || !c) return false; // 判断a,b,c是否非0
memcpy(backup, st, sizeof st);
while (b) {
int x = b % 10;
b /= 10;
if(!x || backup[x]) return false; // 如果x为0 或者 x出现过
backup[x] = true;
}
for (int i = 1; i <= 9; i ++) // 判断一下1~9是否都出现过
if (!backup[i])
return false;
return true;
}
// 枚举 c
void dfs_c(int u, int a, int c) {
if (u == n) return; // 用完了所有数字
if (check(a, c)) ans ++;
for (int i = 1; i <= 9; i ++)
if (!st[i]) {
st[i] = true;
dfs_c(u + 1, a, c * 10 + i);
st[i] = false;
}
}
// 枚举 a
void dfs_a(int u, int a) { // u:当前已经用了几个数字
if(a >= n) return; // 因为带分数的形式a,b,c都要有,不得为空
if(a) dfs_c(u, a, 0);
for (int i = 1; i <= 9; i ++)
if (!st[i]) { // 如果这个数没有被用过
st[i] = true;
dfs_a(u + 1, a * 10 + i);
st[i] = false; // 恢复现场
}
}
int main() {
cin >> n;
dfs_a(0, 0);
cout << ans;
return 0;
}
算法二(暴力法):
$\large\color{red}{暴力出奇迹}$
思路:
$全排列一下 1 到 9 这9个数字$
$判断一下全排列所形成的这些数字是否符合条件:n * c == a * c + b$
$符合, ans ++$
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
int num[15];
int ans;
int get(int l, int r) {
int cnt = 0;
for (int i = l; i <= r; i ++)
cnt = cnt * 10 + num[i];
return cnt;
}
int main() {
cin >> n;
for (int i = 1; i <= 9; i ++) num[i] = i;
do{
for (int i = 1; i <= 9; i ++)
for (int j = i + 1; j <= 9; j ++) {
int a = get(1, i);
int b = get(i + 1, j);
int c = get(j + 1, 9);
if (n * c == a * c + b) ans ++; // 判断构成的a,b,c是否符合条件
}
}while(next_permutation(num + 1, num + 9 + 1)); // 利用全排列函数直接排列一下1~9
cout << ans;
return 0;
}
算法三(暴力法):
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
int num[15];
bool st[15];
int ans;
int get(int l, int r) {
int cnt = 0;
for (int i = l; i <= r; i ++)
cnt = cnt * 10 + num[i];
return cnt;
}
void dfs(int u) {
if (u > 9) {
for (int i = 1; i <= 9; i ++)
for (int j = i + 1; j <= 9; j ++) {
int a = get(1, i);
int b = get(i + 1, j);
int c = get(j + 1, 9);
if (n * c == a * c + b) ans ++; // 判断构成的a,b,c是否符合条件
}
return;
}
for (int i = 1; i <= 9; i ++) // 全排列一下 1 ~ 9
if (!st[i]) {
st[i] = true;
num[u] = i;
dfs(u + 1);
st[i] = false;
num[u] = 0;
}
}
int main() {
cin >> n;
dfs(1);
cout << ans;
return 0;
}