我不知道你不知道我知道了你知道了……智力题什么的最讨厌了……

题记:今天刚好看到群里有人问,平时一向比较不是很喜欢这种脑残智力题的(喂),不过今天还是用程序写了个……没找到标准答案,所以有可能有错,随便了= =||


已知: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满足上述条件,所以乙也能知道


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值