漢諾塔移動步數的計算 (轉)

gugu99發表於2007-10-12
漢諾塔移動步數的計算 (轉)[@more@]

  大家有沒有試過計算漢諾塔的移動步數?是不是算了幾天幾夜也沒有結果,而且還當機了……。現在本人找到了它的一個移動規律現與大家分享。

  漢諾塔移動時,三個盤子要移動7步,這是固定的。當四個盤子時,它先要把最上面的三個盤子移動到另外一根針上(這時移動了7步),然後把第四個盤子移動到另一根針上(這時共移動了8步,三個盤子的7步加上第四個盤子的1步),最後再把那三個盤子移動到第四個盤子上面(又是7步),所以,四個盤子要移動15步。五個盤子也是同樣,我們知道了四個盤子的移動步數是15步,那麼5個盤子就是15+1+15等於31步。由此得出結論:每增加一個盤子,它的移動步數就增加原來步數的一倍加1。如:我們已經知道5個盤子移動31步,那麼,6盤子就是31*2+1=63步。

可編寫C為:

#include

void main(){

long double j=7;  /*j用來記錄盤子的移動步數,因為最少為三個盤子,所  以定義初值為7*/

int i;  /*i用來存放盤子的個數*/

printf("請輸入一個大於等於3,小於等於64的數:");

scanf("%d",&i);

if(i>64&&i<3){

  printf("無法計算");}

else{

  for(x=3;x

  j=j*2+1;}  /*計算移動步數的公式*/

printf("%d個盤子要移動%.0lf步",i,j);}

這樣算起來是不是簡單了很多?以上程式由於long double資料型別的精度問題最多隻能算到53個盤子的移動步數。

由以上公式得出64個盤子的移動步數為:18446744073709551615步


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-976142/,如需轉載,請註明出處,否則將追究法律責任。

相關文章