给一个n,求所有相除正好等于n的五位整数,使它们的数位加起来刚好用尽0~9十个数字。按字典序输出。
分子可由分母算出,所以利用DFS从小到大穷举分母,在分子达到6位时终止枚举。
#include <iostream>
#include <cstring>
using namespace std;
char s[5];
bool taken[10];
bool exceed, ok;
int n;
bool check(int t) {
bool tk[10];
memcpy(tk, taken, sizeof(tk));
for(int i = 0; i < 5; i++) {
if(tk[t % 10])
return false;
tk[t % 10] = true;
t /= 10;
}
return true;
}
void dfs(int d) {
if(d == 5) {
int t = stoi(s);
if(t * n > 98765) {
exceed = true; return;
}
if(check(t * n)) {
ok = true;
printf("%05d / %05d = %d\n", t * n, t, n);
}
return;
}
for(int i = 0; i < 10 && !exceed; i++) {
if(taken[i]) continue;
taken[i] = true; s[d] = '0' + i;
dfs(d + 1);
taken[i] = false;
}
}
int main() {
int kase = 0;
while(cin >> n && n) {
if(kase++) cout << endl;
ok = exceed = false;
dfs(0);
if(!ok) cout << "There are no solutions for " << n << ".\n";
}
return 0;
}