锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

1096 双塔问题

时间:2022-08-27 03:30:00 低浓度甲烷传感器gjc4

1096 双塔问题

聘用的特长绝活
之前真的不明白这个问题。
现在我来试试
这个问题其实很简单,是递推,那么呢?
就这么的了
意思是A柱上的2n将B柱转移到C柱上
emmmmmmmmm
一个保证原则:大小顺序
我不明白这个问题和高精度有什么关系
无非就是一个递推
大意就是 用最少的次数将三个圆柱移到指定的C柱上,然后输出次数(最少)
首先,这个问题是递推和递归,因为移动方式与前项和后项有关,所以我们需要找出这种关系

第1步:将n-将两个圆盘移到B柱上
第二步:将两个最大的圆盘移到C柱上
第3步:将n-两个圆盘移到C柱上

因为第三步的步数=第一步和第二步需要两步
因此,总步数=第1步的步数*2 2

至于为什么n-这有点像步数问题,而不是步数问题n-3或更多,因为它有点类似于递推的边界,例如,我们经常得到它f[1]=1or这相当于为什么要设置f[1]而是别的

然后,我们必须有高精度
为什么要高精度? ,因为数量太大

#include #include #include #include #include #include  int l,n;///盘数和方法数 int a[201],b[201];  using namespace std; void gjc() { 
          int t=0;//剩下的   for(int j=200;j>0;j--)  { 
           l=b[j]*2 t;//n等于2n所以乘二,然后加剩下的    b[j]=l%10;//规律    t=l/10;  } //s递除,否则结果不变   } ///移动过程 void gjj() { 
             int t=0;     for span class="token punctuation">(int j=200;j>0;j--)
     { 
        
         l=a[j]+b[j]+t;
         a[j]=l%10;
         t=l/10;
     }
}//同上 
int main()
{ 
        
	cin>>n;//输入圆盘数量 
	b[200]=1;//位数 
	for(int i=1;i<=n;i++)
	{ 
        
		gjc();//利用高精度将l 2n存入一下,我们以后进行移动圆盘 
		gjj();//移动圆盘 进行一个相加 
	}
	int k=1;
    while (a[k]==0&&k<200)//判断个数 
     k++;
    for (int i=k;i<=200;i++)//模拟200次进行位数 
     printf("%d",a[i]);
	return 0;
 } 
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章