2 solutions

  • 5
    @ 2024-4-10 16:50:11

    题意

    nn 层汉诺塔最少移多少步

    思路

    很好,看样例就知道公式是 2n12 ^ n - 1。不过既然在高精度里面,那这数据肯定不会小

    PS:21500012 ^ {15000} - 1 的位数是 4500 多位

    代码

    #include <bits/stdc++.h>
    using namespace std;
    int a[5000] = {1};	// 长度是 4500 多,这里开大一点
    int main(int argc, char **argv){
    	int n;
    	cin >> n;
    	// 公式:2 ^ n - 1
    	while (n--){
    		int jw = 0;	// 进位
    		for (int i = 0;i < 5000;i++){
    			a[i] *= 2;	// 先乘 2
    			a[i] += jw;	// 再加上上一位进位
    			jw = a[i] / 10;	// 算下一位进位
    			a[i] %= 10;	// 保留个位
    		}
    	}
    	a[0]--;	// 个位减 1
    	int len = 5000;
    	while (a[len] == 0 && len > 0)	len--;	// 清除多余的 0
    	for (int i = len;i >= 0;i--){	// 输出
    		cout << a[i];
    	}
    	return 0;
    }
    
    • 2
      @ 2024-1-22 10:08:05
      #include<bits/stdc++.h>
      using namespace std;
      int a[15010];
      int main()
      {
      	a[1]=1;
      	unsigned long long n;
      	cin>>n;
      	if(n<=63)
      	{
      		unsigned long long a=1;
      		for(int i=1;i<=n;i++)
      		{
      			a*=2;
      		}
      		cout<<a-1<<endl;
      		return 0;
      	}
      	else
      	{
      		for(int i=1;i<=n;i++)
      		{
      			for(int j=1;j<=10000;j++) 
      			{
      				a[j]=a[j]*2;
      			}
      			for(int j=1;j<=10000;j++)
      			{
      				if(a[j]>=10)
      				{
      					a[j+1]+=1;
      					a[j]-=10;
      				}
      			}
      		}
      		a[1]-=1;
      		int i=10000;
      		for(i=10000;i>=1;i--)
      		{
      			if(a[i]!=0) break;
      		}
      		for(;i>=1;i--) cout<<a[i];
      	}
      	return 0;
      }
      

      啊!回来吧我的打表,我最骄傲的信仰!❤️

    • 1

    Information

    ID
    983
    Time
    1000ms
    Memory
    125MiB
    Difficulty
    7
    Tags
    # Submissions
    118
    Accepted
    23
    Uploaded By