汉诺塔移动次数问题:有n个盘子的塔借助另一个塔移动到第三个塔的次数为2^n-1;因为递推关系式为

move(n)=2move(n-1)+1; move(0)=0

故此题代码为

#include <stdio.h>
int res[80];

void calc(int n){
    //2^(n+1)
    int i,j;
    for(i=1;i<=n+1;i++)
    {
        for(j=0;j<80;j++)
            res[j]*=2;

        for(j=0;j<80;j++)
            if(res[j]>=10)
            {
                res[j+1]+=(res[j]/10);
                res[j]%=10;
            }
    }
    //2^(n+1)-2
    for(i=0;i<80;i++)
    {
        res[i]-=2;
        if(res[i]>=0) break;
        else res[i]=10+res[i];
    }

}

int main()
{
    int n,i;
    res[0]=1;
    scanf("%d",&n);
    //计算
    calc(n);
    //输出
    i=80-1;
    while(res[i]==0) i--;
    for(;i>=0;i--) printf("%d",res[i]);
    
    return 0;
}


汉诺塔递归求解
参考代码:

#include <stdio.h>
static int cnt=1;
void Hanoi(int n,int x,int y,int z)
{
    if(n>0)
    {
        Hanoi(n-1,x,z,y);
        printf("step %d:Move top disk from tower %d to top of tower %d\n",cnt++,x,y);
        Hanoi(n-1,z,y,x);
    }
}

int main()
{
    int n;
    scanf("%d",&n);

    Hanoi(n,1,2,3);
    return 0;
}


汉诺双塔递归求解

#include <stdio.h>

static int cnt=1;

void Hanoi(int n,int x,int y,int z)

{

    if(n>0)

    {

        Hanoi(n-1,x,z,y);

        printf("step %d:Move top disk from tower %d to top of tower %d\n",cnt++,x,y);

        Hanoi(n-1,z,y,x);

    }

}


int main()

{

    int n;

    scanf("%d",&n);


    Hanoi(n,1,2,3);

    printf("%d",(cnt-1)*2);

    return 0;

}





点赞(1)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 2 条评论

日暮途远 4年前 回复TA
@日暮途远 单论这个题的话,第20行的循环就直接可以不要,改为result[0]-=2就行,因为result[0]必定大于1,不担心借位
日暮途远 4年前 回复TA
哥,你看看第22行是不是有点问题啊,感觉这样做减2运算结果是不正确的,这道题没出错是因为结果个位总是2,4,8,6中的一个,没有1,必定大于等于2,但如果把101放进这个循环,感觉就会出错