C语言作业基础练习题

1.猜名次

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:

A选手说:B第二,我第三;

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

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

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

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

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

分析:有五个人直接模拟推理有点难,所以用计算机的遍历,将每个人从1到5来一遍,有5^5种可能性,用5层循环就可以了,但是这样会导致一些不期望出现的结果出现,因为我并没有查重,所以会出现两个人抢名次的情况,也就是两个人或者更多的人名次相同的情况,例如两个第二,三个第三这样的,所以即使满足了条件,也要查看一下五个人的名次是否重复,这里用一个函数来处理,只要五个人名次并列,返回0,否则返回1即可。

int checkData(int* p)
{
	char tmp = 0;

	int i;
	for (i = 0; i < 5; i++)
	{
		tmp |= 1 << p[i];
	}
	return tmp == 0x3E;
}

void diveRank(int* p, int n)
{
	if (n >= 5)
	{
		if ((p[1] == 2) + (p[0] == 3) == 1
			&& (p[1] == 2) + (p[4] == 3) == 1
			&& (p[2] == 1) + (p[3] == 2) == 1
			&& (p[2] == 5) + (p[3] == 3) == 1
			&& (p[4] == 4) + (p[0] == 1) == 1&&checkData(p))
		{
			int i = 0;
			for (i = 0; i < 5; i++)
			{
				printf("%d ", p[i]);
			}
			putchar('\n');
		}
		return;
	}
	for (p[n] = 1; p[n] <= 5; p[n]++)
	{
		diveRank(p, n + 1);
	}
}

2.猜凶手

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。

以下为4个嫌疑犯的供词:

A说:不是我。

B说:是C。

C说:是D。

D说:C在胡说

已知3个人说了真话,1个人说的是假话。

现在请根据这些信息,写一个程序来确定到底谁是凶手。

分析:假设凶手是a,b,c,d其中的一个,看是不是满足条件,如果满足就找出了凶手。

int main()
{
	int killer = 0;
	for (killer = 'a'; killer <= 'd'; killer++)
	{
		if ((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd') == 3)
			printf("凶手是:%c", killer);


	}
	return 0;
}

3.在屏幕上打印杨辉三角。

分析:通过找规律得到d[i][j] = d[i - 1][j] + d[i - 1][j - 1]。

int main()
{
    int i = 0;
    int j = 0;
    int arr[10][10] = { 0 };
    for (i = 0; i < 10; i++)
    {
        for (j = 0; j < 10; j++)
        {
            if (0 == j) 
                arr[i][j] = 1;
            if (i == j) 
                arr[i][j] = 1;
            if (i > 1 && j > 0)
            {
                arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
            }
        }
    }
    for (i = 0; i < 10; ++i)
    {
        for (j = 0; j <= i; ++j)
        {
            printf("%-3d ", arr[i][j]);
        }
        printf("\n");
    }
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_64214213/article/details/125023161