该算法很简单,以至于我们只需要三部分就可以完成。以这一题为例:
我们创建一个数组arr[6] = { 1 }
arr[1]到arr[5]分别对应A B C E,数组的值对应的是他们的比赛名次。其中arr[0]是用来立个flag的(也就是说用来做标记)。
接下来我们只需要写两个判断语句,一个循环语句即可简单的解决这样的逻辑推理问题。
一是判断数组是否符合题目要求,我们易得:
if ((arr[2] == 2 && arr[1] != 3) || (arr[2] != 2 && arr[1] == 3))
{
if ((arr[2] == 2 && arr[5] != 4) || (arr[2] != 2 && arr[5] == 4))
{
if ((arr[3] == 1 && arr[4] != 2) || ((arr[3] != 1 && arr[4] == 2)))
{
if ((arr[3] == 5 && arr[4] != 3) || ((arr[3] != 5 && arr[4] == 3)))
{
if ((arr[5] == 4 && arr[1] != 1) || ((arr[5] != 4 && arr[1] == 1)))
{
printf("A = %d, B = %d, C = %d, D = %d, E = %d", arr[1], arr[2], arr[3], arr[4], arr[5]);
}
}
}
}
}
为了不让一个if语句特别长,所以就采用嵌套的形式了。接下来再写一个判断语句,即没有两个人的排名是一样的。易得:
int isDuplicate(int * arr, int len)
{
for (int i = 0; i < len; i++) {
for (int j = i + 1; j < len; j++)
{
if (arr[i] == arr[j])
{
return 0; // 返回0表示存在重复元素
}
}
}
return 1; // 返回1表示不存在重复元素
}
最后我们写一个循环,并且让随机数赋值给数组,然后循环判断,再用arr[0]立个flag就写完了。
以下是完整代码:
#include <stdio.h>
#include <time.h>
int isDuplicate(int * arr, int len)
{
for (int i = 0; i < len; i++) {
for (int j = i + 1; j < len; j++)
{
if (arr[i] == arr[j])
{
return 0; // 返回0表示存在重复元素
}
}
}
return 1; // 返回1表示不存在重复元素
}
int main()
{
int arr[6] = { 0 };
srand(time(NULL));
while (arr[0] + 1)
{
for (int i = 1; i <= 5; i++)
{
arr[i] = rand() % 5 + 1;//让电脑来猜排名,通过循环一直猜,直到猜对为止。
}
if(isDuplicate(arr,6))//=如果为真则执行下面语句,否则一定是猜错了,继续猜。
//这是判断语句,用于判断电脑是否猜对了
if ((arr[2] == 2 && arr[1] != 3) || (arr[2] != 2 && arr[1] == 3))
{
if ((arr[2] == 2 && arr[5] != 4) || (arr[2] != 2 && arr[5] == 4))
{
if ((arr[3] == 1 && arr[4] != 2) || ((arr[3] != 1 && arr[4] == 2)))
{
if ((arr[3] == 5 && arr[4] != 3) || ((arr[3] != 5 && arr[4] == 3)))
{
if ((arr[5] == 4 && arr[1] != 1) || ((arr[5] != 4 && arr[1] == 1)))
{
printf("A = %d, B = %d, C = %d, D = %d, E = %d", arr[1], arr[2], arr[3], arr[4], arr[5]);
arr[0] = -1;//猜对了后把arr[0]变成-1,这样循环就停止了。
}
}
}
}
}
}
return 0;
}
代码的运行:
这个算法的核心思想是硬猜,没猜对就继续猜,直到猜对为止。因此为方法,做逻辑推问题时,我们只需要写一个判断语句判断是否猜对,没猜对就让电脑继续猜,直到猜对为止即可。算法非常简单又暴力。值得注意的是,如果你要提高运行效率,则需要生成不重复的随机数来猜。