当前位置:网站首页>【猜凶手,猜名次,杨辉三角】经典小学奥数的代码逻辑是什么?

【猜凶手,猜名次,杨辉三角】经典小学奥数的代码逻辑是什么?

2022-08-09 22:56:00 tt142

众所周知,数学逻辑无孔不入,那么如何结合自己想奥数题的逻辑来编写代码呢

目录

1.猜凶手

2.猜名次

3.杨辉三角


1.猜凶手

题目


A说:不是我。

B说:是C。

C说:是D。

D说:C在胡说

已知3个人说了真话,1个人说的是假话。那么谁是凶手

 

首先,一个人是不是凶手怎么表达呢,可以用1/0,凶手记为1

所以ABC三个人都有两种可能性,凶手1,好人0

那么就是一个排列组合问题,对应代码就是循环

其中的一个分叉是这样的

观察发现,A==1结果是1    A!=1  的结果是0

如果三个人说的是真的,那么这四个人的话用代码表达出来变成四个表达式

四个表达式之和就应该=3

但是仅仅这样写,发现结果不止一个

因为我们遗漏很重要的显然条件凶手只有一个

那么四个人加起来=1

答案呼之欲出

//猜凶手
//A说:不是我。
//
//B说:是C。
//
//C说:是D。
//
//D说:C在胡说
//
//已知3个人说了真话,1个人说的是假话。
#include<stdio.h>
int main()
{
	int A, B, C, D;
	for (A = 0; A <2; A++)
	{
		for (B = 0; B <2; ++B)
		{
			for (C = 0; C <2; ++C)
			{
				for (D = 0; D <2; ++D)
				{
						if ((!A)+(C)+(D)+(!D)==3&&A+B+C+D==1)
							printf("A=%d B=%d C=%d D=%d\n", A, B, C, D);
					
				}

			}
		}
	}


}

 


2.猜名次

题目

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
A选手说:B第二,我第三;

B选手说:我第二,E第四;

C选手说:我第一,D第二;

D选手说:C最后,我第三;

E选手说:我第四,A第一;

比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

有了上个题目的铺垫,这个题的思路就自然很多,循环从上个题目的3层,变成5层,因为有5个人

同样是每个人的两个判断表达成两个表达式,

由于吗,每个人只有一半说对了

所以一个人说的两句话相加应该=1

并且五个人一定要每个人都有名次,也就是12345

所以五个人相乘应该等于1*2*3*4*5=1203.

答案已经出来了

//5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
//A选手说:B第二,我第三;
//
//B选手说:我第二,E第四;
//
//C选手说:我第一,D第二;
//
//D选手说:C最后,我第三;
//
//E选手说:我第四,A第一;
//
//比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
#include<stdio.h>
int main()
{
	int A, B, C, D, E ;
	for (A = 1; A <= 5; A++)
	{
		for (B = 1; B <= 5; ++B)
		{
			for (C = 1; C <= 5; ++C)
			{
				for (D = 1; D <= 5; ++D)
				{
					for (E = 1; E <= 5; ++E)
					{
						if ((B == 2) + (A == 3)==1 && (B == 2) + (E == 4) == 1 && (C == 1) + (D == 2) == 1 && (C == 5) + (D == 3) == 1 && (E == 4) + (A == 1) == 1 &&A*B*C*D*E==120)
							printf("A=%d B=%d C=%d D=%d E=%d", A, B, C, D, E);
					}
				}

			}
		}
	}
}

 以上两个题是一类问题:判断n个人,每个人说了m句话,其中只有一部分是对的,最后找到结论

思路:

把人抽象为数字,比如用名次12345...代表,或者0/1代表是不是凶手,好人之类

然后写n层循环

每个人的话写成m个表达式

具体分析什么条件(if)成立,则题目得解


 3.杨辉三角

具体运算我们都知道,但是如果只是这样很直白的想,是很难实现的

数学解法是直白的,但是代码实现是灵活的

一个数等于上方两个数之和

int main()
{
	int n;
	scanf("%d", &n);
	int a[100][100];
	for (int i = 0; i < n; i++)
	{
		a[i][0] = 1;
		a[i][i] = 1;    //将每行的第一个和最后一个赋值为1 
	}

	for (int i = 2; i < n; i++)      //已知每个数等于它上方两数的之和 
	{
		for (int j = 1; j < i; j++)
		{
			
			a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
		}
	}


	for (int i = 0; i < n; i++)     //打印输出 
	{
		for (int j = 0; j <= i; j++)
		{
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}
}

原网站

版权声明
本文为[tt142]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_71138261/article/details/126254872