人生亦梦


私信TA

用户名:uq_55161405400

访问量:8861

签 名:

追寻强大且简洁的算法解疑,不会有难题,因而我为此痴迷

等  级
排  名 3060
经  验 2049
参赛次数 1
文章发表 25
年  龄 0
在职情况 学生
学  校
专  业 网络空间安全

  自我简介:

菜,并痴迷着; 爱,并奋斗着

解题思路:

注意事项:

参考代码:

/********************************************/

                /*规律算法:找规律易知,汉诺塔的转移次数为2的n次方减1

                //双汉诺塔为单汉诺塔的两倍,即为2的n+1次方减2

                由于幂指数成爆炸增长,long long类型也存储不下,应用大数阶乘的算法

/********************************************/

#include <stdio.h>

int arr[10000];     //存储大数

int finish(int n);   //处理2的n+1次幂

/********************************************/

int main ()

{

int n;

scanf ("%d",&n);

    n=finish(n);

    for (int i=n-1;i>=0;i--)

    printf ("%d",arr[i]);

return 0;

}

/********************************************/

int finish(int n)

{

arr[0]=1;

int k=1;

int j;

for (int i=0;i<n+1;i++)   //计算2的n+1次幂

{

for ( j=0;j<k;j++)            //每一位都乘2

            arr[j]=arr[j]*2;

            

        for ( j=0;j<k;j++)    //进位

if(arr[j]>=10) 

{

arr[j+1]+=arr[j]/10;

arr[j]=arr[j]%10;

}

if(arr[j]>0)                      //判断最高位

{

    while (arr[j]>=10)

    {

    arr[j+1]+=arr[j]/10;

arr[j]=arr[j]%10;

}

k=j+1;

        }

}

                    //减2,因为易知2的n次幂,个位只可能为2,4,6,8

    arr[0]-=2;

return k;


}


 

0.0分

0 人评分

  评论区

  • «
  • »