实际问题转换代码 -- (选手排名次,猜凶手,杨辉三角的实现)

发布于:2023-01-18 ⋅ 阅读:(353) ⋅ 点赞:(0)

✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。



前言

本文主要通过实际生活问题,考虑如何运用代码更好的实现,这类问题更考虑我们对问题的分析及代码的运用,如有错误,请在评论区指正,让我们一起交流,共同进步!


本文开始

1.编程确定比赛名次

题目内容:
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

1.1题目分析

方法一:①每个选手都可能获得1~5的名次,所有我们需要列出所有的名次可能.这里需要我们使用 循环嵌套 来完成.
②对于每位选手都说对一半,如何统计呢?
我们可以使用真假,当条件为真(1),条件为假(0),每位选手()+()== 1即满足 .
③因为每位选手都可能得到1~5,所以满足条件的 可能会有重复的名次, 我们需要限制条件,每个人1~5名次不重复就有 a* b * c * d * e==120(1 * 2 * 3 * 4 * 5 ==120),可能有不同组合数组也等于120,就有a+b+c+d+e=15(1+2+3+4+5=15).

方法二:
因为每个选手的判断条件有限,而且每位选手都说对一半,所有我们可以列举他们说的可能.
例如:a:(b == 2&&a != 3) || (b != 2 && a == 3)

1.2代码实现

方法一:

#include<stdio.h>
int main()
{
	//我们可以把所有可能列出来,
	//每位选手都可能会得到1-5名
	int a = 0;
	int b = 0;
	int c = 0;
	int d = 0;
	int e = 0;
	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++)
					{
						//每位选手都说的一半,怎么代码实现呢?
						//选手说的对就为真(1),为假(0),所有()+()==1就判断说对了一半
						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)
							)
						{
							//1 2 3 4 5
							if((a*b*c*d*e==120)&&(a+b+c+d+e==15))
							printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);
						}

					}
				}
			}
		}
	}
	return 0;
}

方法二:

#include<stdio.h>
int main()
{
	//5位选手
	int a, b, c, d, e;
	//每位选手排名为1-5
	//把所有可能列出来,嵌套循环
	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) || (b != 2 && a == 3))&&
							((b == 2 && e != 4) || (b != 2 && e == 4)) &&
							((c == 1 && d != 2) || (c != 1 && d == 2)) &&
							((c == 5 && c != 3) || (c != 5 && c == 3)) &&
							((e == 4 && a != 1) || (e != 4 && a == 1)) && (a * b * c * d * e == 120)
							
							)
						{
							printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);
						}
					}
				}
			}
		}
	}
	return 0;
}

2.猜凶手

题目内容
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。

2.1题目分析

思路与排名次相似
①3人真(1),1人假(0)=>()+()+()+()+()=3就可猜出凶手.
②A,B,C,D相邻字符+1就可以依次得到
假设凶手,排列可能,每列加起来为3就满足题意 (1为真话,0为假话).
A (假设A是凶手): 0 - 1 - 1 - 1
B (假设B是凶手): 0 - 0 - 1 - 0
C (假设C是凶手): 0 - 0 - 0 - 1
D (假设D是凶手): 1 - 1 - 1 - 0
【注】假设完凶手,按列分析

2.2代码实现

#include<stdio.h>
int main()
{
	/*思路与排名次相似
	3人真(1),1人假(0)=>()+()+()+()+()=3就可猜出凶手
	A,B,C,D相邻字符+1就可以依次得到*/
	char k = 0;
	//循环依次判断A~D
	for (k = 'A'; k <= 'D'; k++)
	{
		if ((k != 'A') + (k == 'C') + (k == 'D') + (k != 'D') == 3)
		{
			printf("k=%c\n", k);
		}
	}
	return 0;
}

3.杨辉三角

题目内容
在屏幕上打印杨辉三角。例如:
1
1 1
1 2 1
1 3 3 1

3.1题目分析

①经过观察发现每行第一个和最后一个都为1
②中间的数等于例如:a[2][1] = a[1][1] + a[1][0] => a[i][j] = a[i-1][j] + a[i-1][j-1]

定义一个二维数组,先循环将每行首尾赋为1,再循环计算中间的数 a[i][j] = a[i-1][j] + a[i-1][j-1];

3.2代码实现

#include<stdio.h>
int main()
{
	int arr[100][100] = { 0 };
	//输入打印几行
	int n = 0;
	scanf("%d", &n);
	int i = 0;
	int j = 0;
	//每行首尾赋值1
	for (i = 0; i < n; i++)
	{
		arr[i][0] = 1;
		arr[i][i] = 1;
	}
	//求中间值
	for (i = 1; i < n; i++)
	{
		for (j = 1; j < n; j++)
		{
			arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
		}
	}
	//打印杨辉三角
	for (i = 0; i < n; i++)
	{
		for (j = 0; j <= i; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}


总结

✨✨✨各位读友,本篇分享到内容让你体会到代码如何处理实际生活问题了吗?如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。不放弃,一起努力!!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!


网站公告

今日签到

点亮在社区的每一天
去签到