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

沒事發道簡單算法題吧。。最近都在擼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的指數倍的數的問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章