漢諾塔移動步數的計算
大家有沒有試過計算漢諾塔的移動步數?是不是算了幾天幾夜也沒有結果,而且還宕機了……。現在本人找到了它的一個移動規律現與大家分享。
漢諾塔移動時,三個盤子要移動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步