海盜一行七人,在海上打劫了一艘富商的商船,得到很多金幣。
當晚為了慶祝戰果喝了很多酒後,回到各自的船艙睡的不省人事。
第二天第乙個海盜醒來,
從搶來的金幣中拿出一枚扔向大海,以表達對海神的敬意。
然後將剩下的金幣平分成七份,自己帶走其中乙份離開。
第三天第二個海盜醒來,
他不知道第乙個海盜已經走了,
於是也從搶來的金幣中拿出一枚扔向大海。
然後將剩下的金幣平分成七份,自己帶走其中乙份離開。
隨後的五天,剩下的五個海盜依次醒來。
他們也都不知道已經有同伴在他們之前離開,
所以每個人都重複了上乙個人分金幣時的動作。
終於海盜**了,海盜船獨自在海上漂泊,撞上一座島嶼。
島上的村民慶幸的發現船上剩餘的金幣。
請問,富商最少損失了多少金幣,村民們又撿到了多少金幣?1,每天都是扔乙個,再平分成七份,所以每天海盜醒來看到的金幣數量%7結果都是1。
2,本題可以正推,也可以反推。推的過程中唯一的判定標準就是不能出現小數。
正推:
因為我們不知道金幣初始數量,所以只能在乙個足夠大的範圍類去迴圈檢測。
排除題目無解的可能,我們就用while死迴圈來檢測,知道找到答案才跳出。找到答案的標準就是能夠順利的分到第七天,不出現小數。**如下:
void main()
else
}if (i == 7) //如果能按照分配原則,順利分七次,說明我們已經將總數調整為正確答案
}printf("商人被搶劫的金幣數量是:%d\n村民們撿到的金幣數量是:%d", total, currentday);
getchar();
}
反推:假設最後一天的海盜帶走的數量是1,也就是說最後一天他醒來時看到的數量是8,以這個為基準往前推一天就是8/6 * 7+1,所以要確定的是8/6 * 7不可以為小數:
void main()
else
}if (i == 7)
}printf("商人被搶劫的金幣數量是:%d\n村民們撿到的金幣數量是:%d", total, currentday);
getchar();
}
演算法邏輯題 海盜分金幣問題
有5個海盜,獲得了100枚金幣,他們約定乙個分配方案.商議方式 1.有5個海盜輪流提出分配方案 2.如果超出半數海盜 包括提出者 同意該方案,則按照該方案分配 3.如果同意該方案的人數 包括提出者 小於等於半數,則提出者要被扔到海浬餵魚,剩餘海盜繼續商議分配 4.海盜們是絕對理性的,以自己盡可能獲得...
經典數學邏輯問題 海盜分金幣
數學的邏輯有時會導致看來十分怪異的結論。一般的規則是,如果邏輯推理沒有漏洞,那麼結論就必定站得住腳,即使它與 你的直覺矛盾。1998年9月,加利福尼亞州帕洛阿爾托的stephen m.omohundro寄給我一道難題,它恰好就屬於這一類。這 難題已經流傳了至少十年,但是omohundro對它作了改動...
邏輯推理題 海盜分金幣
今晚聽老路 用得上的商學課 第二季番外篇01了解到乙個面試題,很有意思,分享記錄一下。有5個海盜,100枚金幣。首先由1號海盜提出乙個金幣的分配方案,比如說,他說,5個人,每個人20枚金幣,好,這算一種分配方案。這個時候,5個海盜投票,包括1號自己,如果贊成的人數,大於等於一半,那麼這個方案就通過,...