1. 程式人生 > >漢諾塔移動步數的計算

漢諾塔移動步數的計算

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

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

可編寫C程式為:

#include<stdio.h>

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<i;x++)

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

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

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

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