1、 牧师和司事(编程)
有一次,牧师对他的司事说:“今天,我遇到了我们堂区的三位居民。他们年龄的乘积是2450。你能告诉我他们个人的年龄吗?”
司事:不能。
牧师:我还告诉你他们的年龄之和是你的年龄的两倍,你能给我答案吗?
司事:还不能。
牧师:我再告诉你,其中年龄最大的那位比我年龄大。
司事:现在我需要的信息全都有了。
如果,我们假定这位牧师和司事都是数学高手。那么这三位居民的年龄各是多少?
1、 牧师和司事(编程)
有一次,牧师对他的司事说:“今天,我遇到了我们堂区的三位居民。他们年龄的乘积是2450。你能告诉我他们个人的年龄吗?”
司事:不能。
牧师:我还告诉你他们的年龄之和是你的年龄的两倍,你能给我答案吗?
司事:还不能。
牧师:我再告诉你,其中年龄最大的那位比我年龄大。
司事:现在我需要的信息全都有了。
如果,我们假定这位牧师和司事都是数学高手。那么这三位居民的年龄各是多少?
思路:
1.设三人年龄:x,y,z
2.首先,x,y,z必须满足条件:x*y*z = 2450 ,(x+y+z)为2的倍数
3.司事知道三人年龄之和为自身年龄两倍,但是还是不知道具体x,y,z为多少,说明满足以上条件的多组x,y,z中,有两组或两组以上的和为自身年龄。所以在编程中,将和相等的组去掉。
4.牧师说最大年纪的比自己年纪大,司事就知道答案,说明满足以上x,y,z的组中,只有一组其中一个数大于牧师年纪,也就是最大值。代码如下:
public class test{
public static int max(int x,int y,int z){
int temp = x;
if(y > temp)
temp = y;
if(z > temp)
temp = z;
return temp;
}//求三人之中最大值的函数
public static void main(String[]args){
int count = 0;
int flag = 0;
int temp = 0;
int[][]arr = new int[200][5];
//此处的200是凭借常识,一般人年纪不大于200岁,为了减少计算量,当然用2450也可以。
condition con = new condition();
for(int x = 1;x<200;x++)
for(int y = 1;y<200;y++)
for(int z = 1;z<200;z++)
if(con.condition1(x,y,z)*con.condition2(x,y,z)*con.condition3(x,y,z) == 1){
//三个条件均满足的,将x,y,z存于数组中
arr[count][0] = x;
arr[count][1] = y;
arr[count][2] = z;
arr[count][3] = x + y + z;
arr[count][4] = max(x,y,z);
count++;
}
for(int i = 0;i<count - 1;i++)
for(int j = i+1; j<count;j++)
if(arr[i][3] == arr[j][3]){
arr[i][3] = 0;
arr[j][3] = 0;
}
//如果有两组年龄和相等 ,那么将年龄和赋值为0,也就是去掉。
temp = arr[0][4];
for(int i = 1;i<count;i++){
if(arr[i][3] == 0 && arr[i][4]>temp){
flag = i;
}
}
//取所有组中,拥有最大年龄的一组。
System.out.println(arr[flag][0] + " " + arr[flag][1] + " " + arr[flag][2]);
}
}
class condition{
public int condition1(int x,int y,int z){
if(x*y*z == 2450)
return 1;
return 0;
}
public int condition2(int x,int y,int z){
if((x+y+z)%2 == 0)
return 1;
return 0;
}
public int condition3(int x,int y,int z){
if(x>=y&&y>=z)
return 1;
return 0;
}
}
结果:50,7,7,如有问题,加Q303620789