0
点赞
收藏
分享

微信扫一扫

杭电 汉诺塔集合 1995 1996 2064 2077 2175

雅典娜的棒槌 2022-04-22 阅读 33
算法

 都是要找规律,还有对递归的了解

                                                hd 1995

#include<iostream>
#include<string.h> 
using namespace std;
short result[100];
int main(){
	int times,plants,no,pow;
	cin>>times;	
	while(times--){
		cin>>plants>>no;
		pow = plants-no;
		memset(result,0,sizeof(result));
		result[0]=1;
		while(pow--){
			for(int i=0;i<100;i++){
				result[i]*=2;
			}
			for(int i=0;i<100;i++){
				if(result[i]>=10){
					result[i]-=10;
					result[i+1]+=1;
				}
			}
		}
		int index=99;
		while(result[index]==0)
			index--;
		while(index>=0){
			cout<<result[index];
			index--;
		}
		cout<<endl;
	}	
	return 0;
}

 用大数还是蛮简单的

                                                hd1996

#include<iostream>
#include<string.h>
using namespace std;
int a[100];
int main()
{
	int t;
	while(cin>>t&&t){
		int n,k;
		while(cin>>n){
			int w=n;
			
			memset(a,0,sizeof(a));
			a[0]=1;
			while(w--){
				for(int i=0;i<100;i++){
					a[i]*=3;
				}
				//if(w==1)  a[0]+=1;
				for(int j=0;j<100;j++){
					if(a[j]>9){
						a[j+1]+=a[j]/10;
						a[j]=a[j]%10;
					}
				}
			}
			int y=99;
			while(a[y]==0) y--;
			for(int i=y;i>=0;i--) cout<<a[i];
			cout<<endl;
		}
	}
	return 0;
 } 

                                                 hd2064

#include<stdio.h>
int main()
{
 	__int64 a[36],i,n;
	 a[1]=2;
 		for(i=2;i<=35;i++)
  			a[i]=a[i-1]*3+2;    // 移动关系
 		while(scanf("%I64d",&n)==1)
 		{
  		printf("%I64d\n",a[n-1]);
 		}
 	return 0;
}

                                                 hd2077

 

#include<stdio.h>
#include<math.h>
#include<iostream>
using namespace std;
int main()
{
    int t,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        long long int s=pow(3, n-1)+1;
        cout<<s<<endl;
    }
    return 0;
}

                                         hd2175

 我是看他的 杭电2175C++_轲轲公主的博客-CSDN博客

#include<iostream>
#include<cmath>
using namespace std;

int pan(int n, long long m){
    if (n == 1 && m == 1)
        return 1;
    long long mid = pow(2, n - 1);
    if (m == mid)
        return n;
    else if (m > mid)
        return pan(n - 1, m - mid);
    else 
        return pan(n - 1, m);
}

int main(){
    int n;
    long long m;
    while (cin>>n>>m,n||m)
        cout << pan(n,m) << endl;
    return 0;
}
举报

相关推荐

0 条评论