作者bleed1979 (十三)
看板C_and_CPP
標題Re: [問題] c語言請益
時間Thu Sep 22 22:01:41 2011
※ 引述《max660865 (原則)》之銘言:
: 小弟是c語言初學者,想練習所以上網找了程式競賽的題目看一看
: 問題描述:
: 有一個金庫保險箱,外面有一個由五個阿拉伯數字所組成的密碼鎖,設定的密碼也是由這
: 五個數字所組成的,且數字不能重複。保險箱設定密碼之後,若忘了密碼,若要解開此保
: 險箱,若由小到大依序輸入五位數字密碼,請問要輸入幾次才能解開此保險箱。
: 輸入說明:
: 例如:金庫密碼鎖是由阿拉伯數字1,2,3,4,5共5個按鍵所組成,金庫密碼設定為12453。
: 今假使我們忘記密碼之後,若要解開金庫,密碼由小到大開始輸入,依序為12345,
: 12354, 12435, 12453, 密碼要輸入到第4次才可以解開金庫。
: -------------------------------------------------------------------------------
: 最後發現一組規律24*a+6*b+2*c+1*d+1=所需次數
: a=第一個密碼減1
: 但b,c,d我找不出一個結論= ="
: 還是說我的規律根本是錯的?!
可以請問是那題嗎?因為需要驗證我提供的解法。
提供一個情況,12345變成53241需要幾次。
你應該也知道這是階乘關係。
位數 total
1位數 -> 1!次
2位數 -> 2!次
3位數 -> 3!次
所以先看1變到5,5 - 1 = 4,所以後面有4個4!次的變化。
接著把12345的1和5抽掉,把53241的5抽掉。
變成234和3241,再把1加到234形成1234
所以就討論1234變成3241
3 - 1 = 2 --> 2個3!變化
同理抽掉又加回形成討論124和241
2 - 1 = 1 --> 1個2!變化
討論14和41 --> 4 - 1 = 3 但是2和3都用掉了,所以3次 - 用掉的2次 = 1次
(這裡很重要,前面的也要比照辦理要扣掉用掉的)
4 * 24 + 2 * 6 + 1 * 2 + 1 * 1 = 111
方法很rough,但邏輯上應該可以行得通。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.43.113.144
※ 編輯: bleed1979 來自: 114.43.113.144 (09/22 22:02)
→ priv:你的答案好像差1 09/22 22:14
→ priv:124, 142, 214, 241 是第四組不是第三組 09/22 22:26
→ priv:原po的答案看起來是對的 09/22 22:26
→ priv:我說上一篇的原po 09/22 22:26
→ bleed1979:我就知道有人會問這個問題。我算的是步數,但是題目是 09/22 22:42
→ bleed1979:連自己也要輸入,所以要加上自己。 09/22 22:43