1. 程式人生 > >用天平找次品的演算法題,即三等分演算法

用天平找次品的演算法題,即三等分演算法

沒事發道簡單演算法題吧。。最近都在擼python小專案或者爬蟲機器學習之類的,都快把C++忘了

有n個硬幣,其中1個為假幣,假幣重量較輕,你有一把天平,請問,至少需要稱多少次能保證一定找到假幣

這道題應該很多人聽過,解決方法很簡單。不斷三等分,為什麼要是3這個數字呢?因為兩兩比較只有三種情況,<, > 或者=

三等分時,有三種情況:

1.n % 3 == 0

2. n % 3 == 1

3. n % 3 == 2

第1種情況直接三等分,都為n/3

第2種情況:分為n/3, n/3, n/3+1, (C語言除法會截斷小數點後面的)

第3種情況:分為n/3, n/3+1, n/3+1

然後你發現。不管怎樣,都能只稱一次就可以判斷哪堆是正確的。

所以你需要不斷三等分。直到硬幣堆只剩1個,就能找到答案。答案為log3(n)取整數

演算法應是這樣:

int end(int n)
{
	int ans = 0;
	
	if(n % 3 == 0)
		n--;
	
	while(n > 0)
	{
		n /= 3;
		ans++;
	}
	
	return ans;
}

可能你不理解為什麼上面需要n--

那是因為,當n為3的指數倍時,如9,總有9/3 = 3, 9/3=1,剩下1一個本應該停止,但是還是繼續進入迴圈。。變成3次

所以使用n--來減少一次次數。因為4~8進入迴圈返回的ans都為2。雖然6滿足6%3==0但不會出問題,因為6跟5是返回ans都為2。

特殊的只有n的指數倍,但刻意去找n的指數太浪費時間,所以才使用n%3==0來排除,使用這個也不會影響6, 12等雖然滿足3的整數倍但不是n的指數倍的數的問題