C语言习题——练习3

#include<stdio.h>


//1.杨辉三角
//在屏幕上打印杨辉三角。
//1
//1 1
//1 2 1
//1 3 3 1
void YHTri(int n)
{
	//首先初始化为1,以为第一行为1
	int data[30][30] = { 1 };

	//从第二行开始打印
	for (int i = 1; i < n; i++)
	{
		//第一列永远为1
		data[i][0] = 1;

		for (int j = 1; j <= i; j++)
		{
			data[i][j] = data[i - 1][j - 1] + data[i - 1][j];
		}
	}

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

}

void YHTri2(int n)
{
	int data[30] = { 1 };
	printf("1\n");
	for (int i = 1; i < n; i++)
	{
		for (int j = i; j > 0; j--)
		{
			data[j] += data[j - 1];
		}

		for (int j = 0; j <= i; j++)
		{
			printf("%d ", data[j]);
		}
		printf("\n");
	}

}

//2.猜凶手
//日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
//以下为4个嫌疑犯的供词 
//A说:不是我。
//B说:是C。
//C说:是D。
//D说:C在胡说
//已知3个人说了真话,1个人说的是假话。
//现在请根据这些信息,写一个程序来确定到底谁是凶手。
void Guess()
{
	//假设四人都不是凶手
	int murder[4] = { 0 };

	int i;
	//遍历四个人的话
	for (i = 0; i < 4; i++)
	{
		//假设某人是凶手
		murder[i] = 1;
		//满足条件就是你了
		if ((murder[0] != 1) + (murder[2] == 1) + (murder[3] == 1) + (murder[3] != 1) == 3)
		{
			break;
		}
		//不满足还他清白
		murder[i] = 0;
	}
	//输出谁是凶手
	putchar('A'+i);

}

//3.猜名次
//5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
//A选手说:B第二,我第三;
//B选手说:我第二,E第四;
//C选手说:我第一,D第二;
//D选手说:C最后,我第三;
//E选手说:我第四,A第一;
//比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
int CheckData(int *p)
{
	//构造哈希标记表
	int tmp[7] = { 0 };
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		if (tmp[p[i]])
		{
			return 0;
		}
		tmp[p[i]] = 1;
	}
	return 1;

}

int main()
{
	//5.定义选手数组
	int p[5];

	//遍历5名选手的名次,每一名都是从1~5,总共有5^5种情况
	for(p[0]=1;p[0]<=5;p[0]++)
		for(p[1]=1;p[1]<=5;p[1]++)
			for(p[2]=1;p[2]<=5;p[2]++)
				for(p[3]=1;p[3]<=5;p[3]++)
					for (p[4] = 1; p[4] <= 5; p[4]++)
					{
						//每个人50%的概率用||运算
						//这里是五个人的描述,由于比较表达式只有0和1两个结果,如果要两个条件有且只有一个为真,则可以用比较表达式的值总和为1的方式直接判定。别忘了还要判定不能并列。
						if ((p[1] == 2) + (p[0] == 3) == 1 && //B第二,我第三
							(p[1] == 2) + (p[4] == 4) == 1 && //我第二,E第四
							(p[2] == 1) + (p[3] == 2) == 1 && //我第一,D第二
							(p[2] == 5) + (p[3] == 3) == 1 && //C最后,我第三
							(p[4] == 4) + (p[0] == 1) == 1 && //我第四,A第一
							CheckData(p) //不能并列
							)
						{
							//如果满足以上条件,判断是否出现并列情况
							for (int i = 0; i < 5; i++)
							{
								printf("p[%d]=%d\n", i, p[i]);
							}
						}
					}


	2.
	//Guess();

	/*int n = 4;
	YHTri2(4);*/

	return 0;
}


踩坑总结:第三题排名次,第一次使用||操作符来实现每人50%概率,由于逻辑运算操作符只要有一个不满足,后面都不执行,因此出现错误。所以用(a+b)==1来实现更稳定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值