[高精度][codevs 1145]Hanoi双塔问题

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define maxn 2000
#define base 10000
using namespace std;
int n;
struct Bign
{
	int c[maxn],len,sign;
	//初始化
	Bign(){memset(c,0,sizeof(c)),len = 1,sign = 0;}
	//高位清零
	void Zero()
	{
		while(len > 1 && c[len] == 0)len--;
		if(len == 1 && c[len] == 0)sign = 0;
	}
	//压位读入
	void Write(char *s)
	{
		int k = 1,l = strlen(s);
		for(int i = l - 1;i >= 0;i--)
		{
			c[len] += (s[i] - '0') * k;
			k *= 10;
			if(k == base)
			{
				k = 1;
				len++;
			}
		}
	}
	void Read()
	{
		char s[maxn] = {0};
		scanf("%s",s);
		Write(s);
	}
	//输出
	void Print()
	{
		if(sign)printf("-");
		printf("%d",c[len]);
		for(int i = len - 1;i >= 1;i--)printf("%04d",c[i]);
		printf("\n");
	}
	//重载 = 运算符,将低精赋值给高精
	Bign operator = (int a)
	{
		char s[100];
		sprintf(s,"%d",a);
		Write(s);
		return *this;//this只能用于成员函数,表示当前对象的地址
	}
	//重载 < 运算符
	bool operator < (const Bign &a)const
	{
		if(len != a.len)return len < a.len;
		for(int i = len;i >= 1;i--)
		{
			if(c[i] != a.c[i])return c[i] < a.c[i];
		}
		return 0;
	}
	bool operator > (const Bign &a)const
	{
		return a < *this;
	}
	bool operator <= (const Bign &a)const
	{
		return !(a < *this);
	}
	bool operator >= (const Bign &a)const
	{
		return !(*this < a);
	}
	bool operator != (const Bign &a)const
	{
		return a < *this || *this < a;
	}
	bool operator == (const Bign &a)const
	{
		return !(a < *this) && !(*this < a);
	}
	bool operator == (const int &a)const
	{
		Bign b;b = a;
		return *this == b;
	}

	//重载 + 运算符
	Bign operator + (const Bign &a)
	{
		Bign r;
		r.len = max(len,a.len) + 1;
		for(int i = 1;i <= r.len;i++)
		{
			r.c[i] += c[i] + a.c[i];
			r.c[i + 1] += r.c[i] / base;
			r.c[i] %= base;
		}
		r.Zero();
		return r;
	}
	Bign operator + (const int &a)
	{
		Bign b;b = a;
		return *this + b;
	}
	//重载 - 运算符
	Bign operator - (const Bign &a)
	{
		Bign b,c;// b - c
		b = *this;
		c = a;
		if(c > b)
		{
			swap(b,c);
			b.sign = 1;
		}
		for(int i = 1;i <= b.len;i++)
		{
			b.c[i] -= c.c[i];
			if(b.c[i] < 0)
			{
				b.c[i] += base;
				b.c[i + 1]--;
			}
		}
		b.Zero();
		return b;
	}
	Bign operator - (const int &a)
	{
		Bign b;b = a;
		return *this - b;
	}
	//重载 * 运算符
	Bign operator * (const Bign &a)
	{
		Bign r;
		r.len = len + a.len + 2;
		for(int i = 1;i <= len;i++)
		{
			for(int j = 1;j <= a.len;j++)
			{
				r.c[i + j - 1] += c[i] * a.c[j];
			}
		}
		for(int i = 1;i <= r.len;i++)
		{
			r.c[i + 1] += r.c[i] / base;
			r.c[i] %= base;
		}
		r.Zero();
		return r;
	}
	Bign operator * (const int &a)
	{
		Bign b;b = a;
		return *this * b;
	}
	//重载 / 运算符
	Bign operator / (const Bign &b)
	{
		Bign r,t,a;
		a = b;
		//if(a == 0)return r;
		r.len = len;
		for(int i = len;i >= 1;i--)
		{
			t = t * base + c[i];
			int div,ll = 0,rr = base;
			while(ll <= rr)
			{
				int mid = (ll + rr) / 2;
				Bign k = a * mid;
				if(k > t)rr = mid - 1;
				else
				{
					ll = mid + 1;
					div = mid;
				}
			}
			r.c[i] = div;
			t = t - a * div;
		}
		r.Zero();
		return r;
	}
	Bign operator / (const int &a)
	{
		Bign b;b = a;
		return *this / b;
	}
	//重载 % 运算符
	Bign operator % (const Bign &a)
	{
		return *this - *this / a * a;
	}
	Bign operator % (const int &a)
	{
		Bign b;b = a;
		return *this % b;
	}
};

int main()
{
	scanf("%d",&n);
	Bign ans;
	ans =1;
	for(int i=1;i<=n+1;i++)
	ans=ans+ans;
	ans=ans-2;
	ans.Print();
	return 0;
}

时间: 2024-10-09 20:09:10

[高精度][codevs 1145]Hanoi双塔问题的相关文章

codevs 1145 Hanoi双塔问题 2007年NOIP全国联赛普及组

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形).现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存.要求: (1)每次只能移动一个圆盘: (2)A.B.C三根细柱上的圆盘都要保持上小下大的顺序: 任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n

b161: NOIP2007 4.Hanoi双塔问题

zerojudge  汉诺塔?图片问度娘 b161: NOIP2007 4.Hanoi双塔问题 题目: 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形).现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存.要求: (1)每次只能移动一个圆盘: (2)A.B.C三根细柱上的圆盘都要保持上小下大的顺序: 任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An.

【算法:2】hanoi双塔

汉诺塔,经典的递归. 经典的汉诺塔游戏相信很多同学都会玩的,规则就不用赘述,百科一下就OK.有三个柱子A,B,C,A柱子上套有n个大小不等的盘子,任意两个盘子,上面的盘子一定小于下面的盘子.现在请你编写程序计算如何将这n个盘子按照规则移到C柱子上,每次只能移动一个盘子,移动过程中可以借助B柱子,任意状态,各个柱子的盘子必须小盘在放在大盘子上面.现在输入两个正整数n,表示有n个盘子,请输出他的每一次移动. #include<iostream> #include<cstdio> #in

洛谷——P1096 Hanoi双塔问题

https://www.luogu.org/problem/show?pid=1096 题目描述 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形). 现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存.要求: (1)每次只能移动一个圆盘: (2)A.B.C三根细柱上的圆盘都要保持上小下大的顺序: 任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An. 输

[DP][高精][NOIP]Hanoi双塔问题

题目梗概 Hanoi塔问题的基础上,每种圆盘加了一个.实际内容并没有变化. 思考 首先来一波Hanoi问题的步数公式推导: 首先n个不同的圆盘. 只有把n-1个圆盘从a->b,最后把a上剩余的一个圆盘从a->c. 之后把b上的n-1个圆盘从b->c. 这里的两步:把n-1个圆盘从a->c,和n-1个圆盘从b->c.所需要的步骤数.实际上就是把n-1个圆盘从a移动到c的步骤数*2,因为是等价的.从a->b和从b->c移动的圆盘个数都是一样的,所以步数就是 (n-1)

【NOIP2007】第四题&#183;Hanoi双塔问题

题目描述 Description 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形).现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存.要求: (1)每次只能移动一个圆盘: (2)A.B.C三根细柱上的圆盘都要保持上小下大的顺序: 任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An. 输入描述 Input Description 为一个正整数n,表示在

P1096 Hanoi 双塔问题

题目描述 给定AA.BB.CC三根足够长的细柱,在AA柱上放有2n2n个中间有孔的圆盘,共有nn个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3n=3的情形). 现要将这些圆盘移到CC柱上,在移动过程中可放在BB柱上暂存.要求: (1)每次只能移动一个圆盘: (2)AA.BB.CC三根细柱上的圆盘都要保持上小下大的顺序: 任务:设A_nAn?为2n2n个圆盘完成上述任务所需的最少移动次数,对于输入的nn,输出A_nAn?. 输入输出格式 输入格式: 一个正整数n

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

C2第十次解题报告

看过题解后如果觉得还算有用,请帮忙加点我所在团队博客访问量 http://www.cnblogs.com/newbe/ http://www.cnblogs.com/ne走迷宫wbe/p/4069834.html http://www.cnblogs.com/newbe/p/4072005.html 求赞求祝福啊!!! http://www.cnblogs.com/newbe/p/4058097.html 软工老师太狠心,明明做了那么多展示却比别的队差了约100分....还请可怜一下同课不同命的