用计算机跑出来结果即可

英国人,美国人问德国人年龄。给出了11种可能:35,36,39,42,45,46,51,55,58,61,62
德国人将10位告诉了英国人,将个位告诉了美国人。
英国人说:“我不知道德国人的年龄,但我认为美国人也不知道”
美国人说:“我原来不知道德国人的年龄,但是现在我知道了”
英国人说:“现在我也知道了”
请问德国人的年龄是多少

42 手动 对不对?

我觉得有3个答案吧,45,46,61

61
第一句是通过十位和个位不能判断,但是39,58可以判断,去掉三十几和五十几。
第二句是通过个位可以判断了,剩下45,46,61
第三句是通过十位可以判断了,所以是61


 #include <stdio.h>

struct NumPool    //数据池
{

    int value;      //数值
    int num;        //次数
};
NumPool X_numpool[12];  //记录10位
int X_maxpool_num = 0;  

NumPool Y_numpool[12];  //记录个位
int Y_maxpool_num = 0;
void pushNumPush(int num);  //只处理2位数
int GetX_Num(int num);
int GetY_Num(int num);
int main()
{
    int a[15] = { 35,36,39,42,45,46,51,55,58,61,62 };
    int num = 11;
    int team[12][20]; //数据分组 十位相同为一组
    int team_num = 0; //分组数量
    for (int i = 0; i < num; i++)
    {
        pushNumPush(a[i]);
        int j = 0;
        for (j = 0; j < team_num; j++)
        {
            if (team[j][1] / 10 == a[i] / 10)
            {

                team[j][0] ++; //记录该组数量
                team[j][team[j][0]] = a[i]; //增加成员
                break;
            }
        }
        if (j == team_num)
        {
            team[team_num][0] = 1;//初始化数量
            team[team_num][1] = a[i];
            team_num++; //增加组数
        }

    }
    //第一轮帅选
    for (int i = 0; i < team_num; i++)
    {
        for (int j = 1; j <= team[i][0]; j++)
        {
            if (GetY_Num(team[i][j]) <= 1)
            {

                team[i][0] = -1; //当前组全部剔除
                break;
            }
        }
    }
    //第二轮帅选
    X_maxpool_num = 0;
    Y_maxpool_num = 0; //初始化数据池
    for (int i = 0; i < team_num; i++)
    {
        for (int j = 1; j <= team[i][0]; j++)
        {
            pushNumPush(team[i][j]);
        }
    }
    for (int i = 0; i < team_num; i++)
    {
        for (int j = 1; j <= team[i][0]; j++)
        {
            if (GetY_Num(team[i][j]) > 1)
            {
                team[i][j] = -1;    //删除不符合项
            }
        }
    }
    int result[10];
    int result_num = 0;
    ///第3轮帅选
    for (int i = 0; i < team_num; i++)
    {
        int num = team[i][0];
        for (int j = 1; j <= team[i][0]; j++)
        {
            int key;
            if (team[i][j] == -1)
            {
                num--;
                //result[result_num++] 
            }
            else
            {
                key = team[i][j];
            }
            if (num == 1) { 
                result[result_num] = key;
                result_num++;
            }
        }
    }
    //打印结果
    for (int i = 0; i < result_num; i++)
    {
        printf("%d\n", result[i]);
    }

}
int GetX_Num(int num)
{
    int x = num / 10;
    for (int i = 0; i < X_maxpool_num; i++)
    {
        if (x == X_numpool[i].value)
        {
            return X_numpool[i].num;
        }
    }
    return 0;
}
int GetY_Num(int num)
{
    int y = num % 10;
    for (int i = 0; i < Y_maxpool_num; i++)
    {
        if (y == Y_numpool[i].value)
        {
            return Y_numpool[i].num;
        }
    }
    return 0;
}

void pushNumPush(int num)
{
    int x = num / 10;   //十位
    int y = num % 10;   //个位
    int i;

    for (i = 0; i < X_maxpool_num; i++)
    {
        if (X_numpool[i].value == x)
        {
            X_numpool[i].num += 1;
            break;
        }
    }
    if (i == X_maxpool_num)
    {
        X_numpool[X_maxpool_num].value = x;
        X_numpool[X_maxpool_num].num = 1;
        X_maxpool_num++;
    }

    for ( i = 0; i < Y_maxpool_num; i++)
    {
        if (y == Y_numpool[i].value)
        {
            Y_numpool[i].num++;
            break;
        }
    }
    if (i == Y_maxpool_num)
    {
        Y_numpool[Y_maxpool_num].value = y;
        Y_numpool[Y_maxpool_num].num = 1;
        Y_maxpool_num++;
    }
}

结果61
图片说明