主题:一道精典的数学题(冠军问题)
xpycc
[专家分:410] 发布于 2005-07-17 08:33:00
甲乙丙丁戊五个人在运动会上分获百米、二百米、跳高、跳远和铅球冠军,有四个人猜测比赛结果:
A说:乙获铅球冠军,丁获跳高冠军。
B说:甲获百米冠军,戊获跳远冠军。
C说:丙获跳远冠军,丁获二百米冠军。
D说:乙获跳高冠军,戊获铅球冠军。
其中每个人都只说对一句,说错一句。求五人各获哪项冠军。
回复列表 (共15个回复)
沙发
cwbcxy [专家分:20] 发布于 2005-07-17 11:25:00
丁获跳高冠军
丙获跳远冠军
戊获铅球冠军
甲获百米冠军
已获二百米冠军
可以用c语言的不儿型进行编程
板凳
a120zq [专家分:0] 发布于 2005-07-18 13:53:00
Private Sub Command1_Click()
Dim z As Integer
Dim A1 As Boolean 'A说的第一句话
Dim A2 As Boolean 'A说的第二句话
Dim B1 As Boolean 'B说的第一句话
Dim B2 As Boolean 'B说的第二句话
Dim C1 As Boolean 'C说的第一句话
Dim C2 As Boolean 'C说的第二句话
Dim D1 As Boolean 'D说的第一句话
Dim D2 As Boolean 'D说的第二句话
Dim Flag As Boolean
For z = 0 To 255
Flag = False
A1 = (z And 128) / 128
A2 = (z And 64) / 64
B1 = (z And 32) / 32
B2 = (z And 16) / 16
C1 = (z And 8) / 8
C2 = (z And 4) / 4
D1 = (z And 2) / 2
D2 = (z And 1) / 1
If A1 + A2 = 0 Then Flag = 1 '每个人说得不能全是假话
If B1 + B2 = 0 Then Flag = 1
If C1 + C2 = 0 Then Flag = 1
If D1 + D2 = 0 Then Flag = 1
If A1 * A2 = 1 Then Flag = 1 '每个人只能说一句真话
If B1 * B2 = 1 Then Flag = 1
If C1 * C2 = 1 Then Flag = 1
If D1 * D2 = 1 Then Flag = 1
If A1 * D1 = 1 Then Flag = 1 '每名运动员只能获得一项冠军
If A2 * C2 = 1 Then Flag = 1
If B2 * D2 = 1 Then Flag = 1
If A1 * D2 = 1 Then Flag = 1 '每个项目只能有一个冠军
If A2 * D1 = 1 Then Flag = 1
If B2 * C1 = 1 Then Flag = 1
If Flag = 0 Then Text1.Text = z
Next z
End Sub
通过上面的程序,可以求得z的值是105,对应的二进制为01101001
这样便知A说的第二句话,B说的第一句话,C说的第一句话,D说的第二句话是真话
对应的冠军是
丁获跳高冠军
甲获百米冠军
丙获跳远冠军
戊获铅球冠军
最后剩下的乙获二百米冠军
由于本人编程水平有限,本程序代码效率并不高,希望高手给予指点。
3 楼
davidw017 [专家分:4170] 发布于 2005-07-18 15:28:00
反正是经典的数学题,我厚道人给出代码 in C
#include <stdio.h>
#include <string.h>
int main(void)
{
int a,b,c,d,e,n;
char c[10][10]={"BaiMi","ErBaiMi","TiaoGao","TiaoYuan","QianQiu"};
for (a=1;a<=5;a++)
for (b=1;b<=5;b++)
for (c=1;c<=5;c++)
for (d=1;d<=5;d++) {
e = 15 - a - b - c - d;
if (a*b*c*d*e!=120) break;
if ((n=((b==5)+(d==3)))!=1) break;
if ((n=((a==1)+(e==4)))!=1) break;
if ((n=((c==4)+(d==2)))!=1) break;
if ((n=((b==3)+(e==5)))!=1) break;
printf("A:",c[a-1]);
printf("B:",c[b-1]);
printf("C:",c[c-1]);
printf("D:",c[d-1]);
printf("E:",c[e-1]);
}
return 0;
}
4 楼
xpycc [专家分:410] 发布于 2005-07-19 11:34:00
有没有Pascal的?
5 楼
XVenus [专家分:20] 发布于 2005-07-19 19:53:00
冠军问题?
我随便用写了一个,没有编译呢,如果不行再告诉我。
Program ex;
Var
a, b, c, d, e: Integer;
Begin
For a:=1 To 5 Do
For b:=1 To 5 Do
For c:=1 To 5 Do
For d:=1 To 5 Do
For e:=1 To 5 Do If [a, b, c, d, e]=[1..5] Then
If (ord(b=5)+ord(d=3)=1) And (ord(a=1)+ord(e=4)=1)
And (ord(c=4)+ord(d=2)=1) And (ord(b=3)+ord(e=5)=1)
Then Writeln(a:4,b:4,c:4,d:4,e:4);
Readln;
End.
6 楼
delphi6 [专家分:3450] 发布于 2005-07-19 20:35:00
这种题的原理是什么啊?
7 楼
XVenus [专家分:20] 发布于 2005-07-19 22:19:00
原理?我也不好说,就是判断对错吧。我使用的是ord判断的
8 楼
xpycc [专家分:410] 发布于 2005-07-20 12:42:00
能讲得具体些么?
9 楼
XVenus [专家分:20] 发布于 2005-07-21 14:41:00
判断一个条件,如果是正确的,则ord(xxx)=1,否则为0
10 楼
kero [专家分:0] 发布于 2005-07-23 00:19:00
5楼用的穷举啊 算法是对的 但是没3楼的算法优。。。
我来回复