题目链接:UVa 725
题意:
输入正整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列(可以有前导0),2<=n<=79。
分析:
暴力枚举。5个for循环,然后检验即可。
CODE:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int n, t1, t2, vis[10], bad, a[5], i[5], first=1;
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
while (cin >> n)
{
if (n == 0) break;
if (first) first = 0;
else putchar('\n');
int flag = 0;
for (i[0] = 0; i[0] < 10; i[0] ++ )
{
for (i[1] = 0; i[1] < 10 ; i[1] ++)
{
for (i[2] = 0; i[2] < 10 ; i[2] ++)
{
for (i[3] = 0; i[3] < 10 ; i[3] ++)
{
for (i[4] = 0; i[4] < 10 ; i[4] ++)
{
bad = 0;
for (int j = 0; j < 5; j++)
{
for (int k = j + 1; k < 5; k++)
{
if (i[j] == i[k])
{
bad = 1;
break;
}
}
if (bad) break;
}
if (bad) continue;
memset(vis, 0, sizeof(vis));
t1 = i[0] * 10000 + i[1] * 1000 + i[2] * 100 + i[3] * 10 + i[4];
if (t1%n) continue;
t2 = t1/n;
for (int j = 0; j < 5; j++)
{
a[j] = t2 % 10;
t2 /= 10;
vis[a[j]] = 1;
vis[i[j]] = 1;
}
bad = 0;
for (int j = 0; j < 10; j++)
{
if (vis[j] == 0)
{
bad = 1;
break;
}
}
if (bad) continue;
printf("%5d / %05d = %d\n", t1, t1/n, n);
flag = 1;
}
}
}
}
}
if (!flag) printf("There are no solutions for %d.\n", n);
}
return 0;
}