1. 程式人生 > 其它 >1、日本某地發生了一件謀殺案,根據供詞及其真假情況寫一個程式來確定到底誰是凶手 2、根據運動員的預測結果及其預測的正確情況,寫程式確定名次

1、日本某地發生了一件謀殺案,根據供詞及其真假情況寫一個程式來確定到底誰是凶手 2、根據運動員的預測結果及其預測的正確情況,寫程式確定名次

技術標籤:practicesc語言

1、 日本某地發生了一件謀殺案,警察通過排查確定殺人凶手必為4個嫌疑犯的一個。以下為4個嫌疑犯的供詞:A說:不是我。B說:是C。C說:是D。D說:C在胡說。已知3個人說了真話,1個人說的是假話。現在請根據這些資訊,寫一個程式來確定到底誰是凶手。

程式碼思路:首先建立一個字元變數murderer表示凶手,讓其從A到D遍歷。然後將四個人的供詞用表示式寫出來,相加,放入if語句的判斷條件中,三真一假(即為3)。能滿足條件進入if語句的murderer即為凶手。
A的供詞:murderer != ‘A’;
B的供詞:murderer == ‘C’;
C的供詞:murderer == ‘D’;

D的供詞:murderer != ‘D’;

int main()
{
	char m = 0;
	for (m = 'A'; m <= 'D'; m++)
	{
		if ((m != 'A') + (m == 'C') + (m == 'D') + (m != 'D') == 3)//if的括號裡表示式是真則為1,假則為0
		{
			printf("the murderer is %c\n", m);
		}
	}
	return 0;
}

執行結果:
在這裡插入圖片描述

2、5位運動員參加了10米臺跳水比賽,有人讓他們預測比賽結果:A選手說:B第二,我第三;B選手說:我第二,E第四;C選手說:我第一,D第二;D選手說:C最後,我第三;E選手說:我第四,A第一;比賽結束後,每位選手都說對了一半,請程式設計確定比賽的名次。

程式碼思路:與上個問題類似,先建立5個整形變數a、b、c、d、e表示五位運動員A、B、C、D、E的名次。再將它們依次從第一名~第五名(即1到5)遍歷。然後將5名運動員的預測結果用表示式寫出來,放入if語句的判斷條件中去。能滿足條件進入if語句的a、b、c、d、e就是正確排名
注意:這裡除了運動員的預測結果,還有一個隱含條件:五名運動員的名次各不相同,分別為1、2、3、4、5

由於每位選手都只說對了一半,因此每位選手預測的兩個名次中一個為真,一個為假。表示式相加為1:
A:(b == 2) + (a == 3) == 1
B:(b == 2) + (e == 4) == 1
C:(c == 1) + (d == 2) == 1

D:(c == 5) + (d == 3) == 1
E:(e == 4) + (a == 1) == 1
隱含條件:
a * b * c * d * e == 120(注意:不能表示為a+b+c+d+e==15,當他們的和為15時也可能名次重複,例如:1、2、2、5、5)

int main()
{
	int a = 0; //建立5個變量表示各選手名次
	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++)
					{
						if ((a == 3) + (b == 2) == 1 &&
							(b == 2) + (e == 4) == 1 && 
							(c == 1) + (d == 2) == 1 && 
							(c == 5) + (d == 3) == 1 && 
							(a == 1) + (e == 4) == 1 &&
							(a*b*c*d*e==120))//a、b、c、d、e各不相等,它們分別為1~5,故它們的乘積必為120
						{
							printf("a=%d, b=%d, c=%d, d=%d, e=%d\n", a, b, c, d, e);
						}
					}
				}
			}
		}
	}
	return 0;
}

執行結果:
在這裡插入圖片描述