题意:输入正整数n,按从小到大的书讯输出所有形如 abcde/fghij=n 的表达式,其中a~j恰好为0~9的一个排列(可以有前导0), 2≤n≤79 。(本段摘自《算法竞赛入门经典(第2版)》)
分析:水题,直接暴力枚举fghij即可。
代码:
#include <fstream>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <stack>
#include <sstream>
#include <string>
#include <map>
#include <cmath>
#include <queue>
#include <vector>
#include <set>
#include <string>
#include <vector>
using namespace std;
const int maxn = 2000 + 5;
int n, a, b, c, d, e, f, g, h, i, j, x, y;
bool flag, first;
bool judge()
{
if (f == a || f == b || f == c || f == d || f == e)
return false;
if (g == a || g == b || g == c || g == d || g == e || g == f)
return false;
if (h == a || h == b || h == c || h == d || h == e || h == f || h == g)
return false;
if (i == a || i == b || i == c || i == d || i == e || i == f || i == g || i == h)
return false;
if (j == a || j == b || j == c || j == d || j == e || j == f || j == g || j == h || j == i)
return false;
return true;
}
int main()
{
while (~scanf("%d", &n), n)
{
if (first)
printf("\n");
else
first = true;
flag = true;
for (a = 0; a < 10; ++a)
for (b = 0; b < 10; ++b)
if (b != a)
for (c = 0; c < 10; ++c)
if (c != a && c != b)
for (d = 0; d < 10; ++d)
if (d != a && d != b && d != c)
for (e = 0; e < 10; ++e)
if (e != a && e != b && e != c && e != d)
{
x = a * 10000 + b * 1000 + c * 100 + d * 10 + e;
y = x * n;
if (y > 99999)
break;
f = y / 10000;
g = (y / 1000) % 10;
h = (y / 100) % 10;
i = (y / 10) % 10;
j = y % 10;
if (judge())
{
flag = false;
printf("%d%d%d%d%d / %d%d%d%d%d = %d\n", f, g, h, i, j, a, b, c, d, e, n);
}
}
if (flag)
printf("There are no solutions for %d.\n", n);
}
return 0;
}