题意:
输入正整数n,按从小到大的顺序输出所有形如 abcde / fghij = n的表达式,其中 a~j 恰好为数字 0~9的一个排列(可以有前导0),2 <= n <= 79.
分析:
记表达式为 a / b = n,只要枚举出b, 相应的a = n * b,然后判断a, b是否所有的数字都不相同即可。
n的最小值是2,可以确定b的枚举起始范围是 [1234, 98765 / 2]。
# include <iostream>
# include <cstdio>
# include <algorithm>
using namespace std;
int n;
bool used[10];
bool check(int b)
{
int a = b * n;
if(a > 98765) return false;
fill(used, used + 10, 0);
char str[15];
sprintf(str, "%05d%05d", a, b);
for(int i = 0; i < 10; ++i)
{
if(used[str[i] - '0'])
return false;
used[str[i] - '0'] = true;
}
return true;
}
int main()
{
#ifdef LOCAL
freopen("data.in", "r", stdin);
#endif // LOCAL
int line = 0;
while(cin >> n && n)
{
if(line++) cout << endl;
int cnt = 0;
for(int b = 1234; b <= 49383; ++b)
{
if(check(b)){
cnt++;
printf("%05d / %05d = %d\n", b * n, b, n);
}
}
if(!cnt)
printf("There are no solutions for %d.\n", n);
}
return 0;
}