题记:今天刚好看到群里有人问,平时一向比较不是很喜欢这种脑残智力题的(喂),不过今天还是用程序写了个……没找到标准答案,所以有可能有错,随便了= =||
已知:x和y都是自然数,且1<x<y<30.
我把x+y的结果告诉了甲,把x*y的结果告诉了乙。
甲说:“我不知道x和y各是多少。”
乙说:“我也不知道x和y各是多少。”
甲又说:“我知道x和y是多少了。”
接着乙也说:“我也知道x和y是多少了”。
请问:x和y各是多少。
代码如下:
#include "stdafx.h"
// ============================================================================
// ==============================================================================
int SumNum(int nSum)
{
//~~~~~~~~~
int nX = 0;
int nY = 0;
int nCnt = 0;
//~~~~~~~~~
for (nX = 2; nX < 30; ++nX) {
for (nY = nX + 1; nY < 30; ++nY) {
if (nX + nY == nSum) {
++nCnt;
}
}
}
return nCnt;
}
// ============================================================================
// ==============================================================================
int ProductNum(int nProduct)
{
//~~~~~~~~~
int nX = 0;
int nY = 0;
int nCnt = 0;
//~~~~~~~~~
for (nX = 2; nX < 30; ++nX) {
for (nY = nX + 1; nY < 30; ++nY) {
if (nX * nY == nProduct) {
++nCnt;
}
}
}
return nCnt;
}
// ============================================================================
// ==============================================================================
int OneSumProductNotOnlyOneNum(int nSum)
{
//~~~~~~~~~
int nX = 0;
int nY = 0;
int nCnt = 0;
//~~~~~~~~~
for (nX = 2; nX < 30; ++nX) {
for (nY = nX + 1; nY < 30; ++nY) {
if (nX + nY == nSum && ProductNum(nX * nY) > 1) {
++nCnt;
}
}
}
return nCnt;
}
// ============================================================================
// ==============================================================================
bool HaveXY(int nSum, int nProduct, int &nX, int &nY)
{
//~~~~~~~~~
int nCnt = 0;
//~~~~~~~~~
for (nX = 2; nX < 30; ++nX) {
for (nY = nX + 1; nY < 30; ++nY) {
if (nX + nY == nSum && nX * nY == nProduct) {
return true;
}
}
}
return false;
}
// ============================================================================
// ==============================================================================
int _tmain(int argc, _TCHAR *argv[])
{
//~~~~~~~~~~~~~~
int nSum = 0;
int nProduct = 0;
int nX = 0;
int nY = 0;
int nCnt = 0;
int nSumStore = 0;
//~~~~~~~~~~~~~~
for (nProduct = 4; nProduct < 900; ++nProduct) {
nCnt = 0;
for (nSum = 4; nSum < 60; ++nSum) {
if (HaveXY(nSum, nProduct, nX, nY) && SumNum(nSum) > 1
&& ProductNum(nProduct) > 1) {
if (nSum == 17) {
int t = 1;
}
if (OneSumProductNotOnlyOneNum(nSum) == 1) {
nSumStore = nSum;
++nCnt;
}
}
}
if (nCnt >= 1) {
HaveXY(nSumStore, nProduct, nX, nY); // Get X, Y here
printf("Sum %d Product %d x %d y %d/n", nSumStore, nProduct, nX, nY);
}
}
getchar();
return 0;
}
结果:
Sum 8 Product 12 x 2 y 6
Sum 10 Product 24 x 4 y 6
Sum 42 Product 432 x 18 y 24
Sum 46 Product 504 x 18 y 28
咱还以为是一组解呢,原来有四组么……顺便……甲乙你们只是聪明而已?确定不是人形自走电脑么= =||
P.S. 解的解释
e.g.
x=18/y=24/和42 乘积 432
13 29 30内唯一分解
14 28 30内唯一分解
15 27 30内唯一分解
16 26 30内唯一分解
17 25 30内唯一分解
18 24 还有 16 27的分解
19 23 30内唯一分解
20 22 30内唯一分解
这样就可以确定,一定是18/24
这组解同时也满足,乙知道甲知道后也知道的情况,乘积在432时,只有42满足上述条件,所以乙也能知道