4柱汉诺塔问题(大数运算处理)
递推公式:f(1)=1, f(i)=min(2f(k)+2^(i-k)-1 ,1<=k<i)
得到数列:1,3,5,9,13,17,25,33,41,49,65...
规律:f(1)=1,之后每i个数增加2^(i-1),i为大于等于2的自然数列,用大数处理即可
附代码:
#include <stdio.h>
#include <string.h>
int d2[120][60];
int hanoi[10050][60];
int main()
{
int n;
memset(d2,0,sizeof(d2));
d2[0][0]=1;
for(int i=1; i<=150; i++)
{
for(int j=0; j<60; j++)
{
d2[i][j]+=d2[i-1][j]*2;
if(d2[i][j]>9)
{
d2[i][j+1]++;
d2[i][j]%=10;
}
}
}
memset(hanoi,0,sizeof(hanoi));
hanoi[0][0]=0;
int p=1;
for(int i=0; i<=150 && p<=10000; i++)
{
for(int j=1; j<=i+1 && p<=10000; j++)
{
for(int k=0; k<60; k++)
{
hanoi[p][k]+=hanoi[p-1][k]+d2[i][k];
if(hanoi[p][k]>9)
{
hanoi[p][k+1]++;
hanoi[p][k]%=10;
}
}
p++;
}
}
while(scanf("%d",&n)==1)
{
int s;
for(int i=59;i>=0;i--)
{
if(hanoi[n][i]!=0){s=i;break;}
}
for(int i=s;i>=0;i--)
printf("%d",hanoi[n][i]);
printf("\n");
}
return 0;
}