回 帖 发 新 帖 刷新版面

主题:一道精典的数学题(冠军问题)

甲乙丙丁戊五个人在运动会上分获百米、二百米、跳高、跳远和铅球冠军,有四个人猜测比赛结果:
          A说:乙获铅球冠军,丁获跳高冠军。
          B说:甲获百米冠军,戊获跳远冠军。
          C说:丙获跳远冠军,丁获二百米冠军。
          D说:乙获跳高冠军,戊获铅球冠军。
其中每个人都只说对一句,说错一句。求五人各获哪项冠军。

回复列表 (共15个回复)

沙发

丁获跳高冠军
丙获跳远冠军
戊获铅球冠军
甲获百米冠军
已获二百米冠军
可以用c语言的不儿型进行编程

板凳

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 楼

反正是经典的数学题,我厚道人给出代码 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 楼

有没有Pascal的?

5 楼

冠军问题?
我随便用写了一个,没有编译呢,如果不行再告诉我。

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 楼

这种题的原理是什么啊?

7 楼

原理?我也不好说,就是判断对错吧。我使用的是ord判断的

8 楼

能讲得具体些么?

9 楼

判断一个条件,如果是正确的,则ord(xxx)=1,否则为0

10 楼

5楼用的穷举啊 算法是对的 但是没3楼的算法优。。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册