法国数学家梅齐亚克在他所创的《数学组合游戏》中提到:一个商人有一个质量为40磅的砝码,一天他一不小心将该砝码摔成了4块。商人发现每块砝码的质量都是整磅数,而且每块砝码的质量都是各不相同,并且发现者4块砝码碎片可以再天平上称出1~40磅之间的任意质量,(整磅数,即2磅,2磅,……)问着4块砝码碎片的质量各是多少?
以下是用C语言写的代码:
#include <stdio.h>
int getWeight(int i, int j, int k, int s, int weight)
{
int x1, x2, x3, x4;
for (x1 = -1; x1 <= 1; x1 ++)
for (x2 = -1; x2 <= 1; x2 ++)
for (x3 = -1; x3 <= 1; x3 ++)
for (x4 = -1; x4 <= 1; x4 ++)
if ( x1 * i + x2 * j + x3 * k + x4 * s == weight)
{
return 1;
}
return 0;
}
int justify(int i, int j, int k, int s)
{
int weight;
for (weight = 1; weight <= 40; weight ++)
{
if (!getWeight(i, j, k, s, weight))
return 0;
}
return 1;
}
pieces()
{
int i, j, k, s;
for (i = 1; i <= 40; i ++)
for (j = 1 + i; j <= 40 - i; j ++)
for (k = 1 + j; k <= 40 - j - i; k ++)
for (s = 1 + k; s <= 40 - i - j - k; s ++)
if (i + j + k + s == 40)
{
if (justify(i, j, k, s))
{
printf("The weight is broken up 4 pieces:\n");
printf("%d %d %d %d\n", i, j, k, s);
}
}
}
main()
{
pieces();
getchar();
}
以下是运行结果:1,3,9, 27