题目:
使用1-8这8个数字,组成abc*d=efgh或者ab*cd=efgh形式的等式。要求,每个数字被使
用1次。求出所有不重复的解。
解答一(VB)
比较容易想到但十分繁琐的解题思路
Dim i, j, k, l, m, n, o, p As Integer
For i = 1 To 8
For j = 1 To 8
Do While j = i And j < 8
j = j + 1
Loop
For k = 1 To 8
Do While (k = j Or k = i) And k < 8
k = k + 1
Loop
For l = 1 To 8
Do While (l = k Or l = j Or l = i) And l < 8
l = l + 1
Loop
For m = 1 To 8
Do While (m = l Or m = k Or m = j Or m = i) And m < 8
m = m + 1
Loop
For n = 1 To 8
Do While (n = m Or n = l Or n = k Or n = j Or n = i) And n < 8
n = n + 1
Loop
For o = 1 To 8
Do While (o = n Or o = m Or o = l Or o = k Or o = j Or o = i) And o < 8
o = o + 1
Loop
For p = 1 To 8
Do While (p = o Or p = n Or p = m Or p = l Or p = k Or p = j Or p = i) And p &l
t; 8
p = p + 1
Loop
If p <> o And p <> n And p <> m And p <> l And p <>
; k And p <> j And p <> i And o <> n And o <> m And o &l
t;> l And o <> k And o <> j And o <> i And j <> i And
k <> j And k <> i And l <> k And l <> j And l <>
i And m <> l And m <> k And m <> j And m <> i And n <
> m And n <> l And n <> k And n <> j And n <> i Then
If (i * 100 + j * 10 + k) * l = m * 1000 + n * 100 + o * 10 + p Then
Print i; j; k; "*"; l; "="; m; n; o; p
ElseIf (i * 10 + j) * (k * 10 + l) = m * 1000 + n * 100 + o * 10 + p And i * 1
0 + j < k * 10 + l Then
Print i; j; "*"; k; l; "="; m; n; o; p
End If
End If
Next p
Next o
Next n
Next m
Next l
Next k
Next j
Next i
解答二(C)
一种效率较高但比较难理解的解题思路
#include <stdio.h>
#define MAX_DIGIT 8
#define BUFFER_LEN 9
int
main ()
{
int i, pos = 0, digit, result;
int x, y, z;
for (i = 0; i < BUFFER_LEN; i++)
digit = 0;
for (i = 0; i < BUFFER_LEN; i++)
result = 0;
while (pos >= 0)
{
//Search available digit
for (i = result + 1; i <= MAX_DIGIT; i++)
{
if (digit == 0)
{
digit] = 0;
digit = 1;
result = i;
i = result;
if (pos == MAX_DIGIT)
{
//abc * d = efgh
x = result * 100 + result * 10 + result;
y = result;
z =
result * 1000 + result * 100 + result * 10 +
result;
if (x * y == z)
printf ("%d * %d = %dn", x, y, z);
//ab * cd = efgh
x = result * 10 + result;
y = result * 10 + result;
if ((x <= y) && (x * y == z))
printf ("%d * %d = %dn", x, y, z);
pos--;
}
}
}
if (pos == 0)
break;
digit] = 0;
result = 0;
}
return 0;
}
个人推荐使用C语言实现的那种方法,不过实在不懂的用VB的那种也可以。
--
※作者已于 2005-01-18 18:28:10 修改本文※
|