/*1028. Hanoi Tower Sequence
思路:
1.从一根柱子到另一根柱子,移动1个盘子需要f(1)=1步,移动k(k>1)个盘子需要
f(k)=f(k-1)+1+f(k-1)步。则有f(k)+1=2( f(k-1) + 1) = 2^2*(f(k-2)+1)
... f(k) +1 = 2 ^ k * [f(k-k) +1] = 2^k
即得到f(k)=2^k-1。
2.设第p个数为k,则该序列的结构为:
2^(k-1)-1个数,数字k,2^(k-1)-1个数
因此2^(k-1)-1+1=p,即
2^(k-1)=p; (k-1) = log2(p)
因此,输入p,只要判断p被2整除的次数,再+1即得结果.
*/
#include <stdlib.h>
#include <iostream>
#include <string>
using namespace std;
int main()
{
int testN;
string p;
cin >> testN;
for(int i=1; i<=testN; i++){
int count = 0;
cin >> p;
for(int k=0; k<p.length(); k++)
p[k] = p[k] - '0';
while(1){
int k;
for(k=0; k<p.length()-1; k++){
p[k+1] += p[k]%2 *10;
p[k] /= 2;
}
if(p[p.length()-1]%2 == 1)
break;
p[p.length()-1] /= 2;
count++;
}
if(i != 1)
cout << endl;
cout<< "Case " << i << ": " << count+1 << endl;
}
system("pause");
return 0;
}
Sicily.1028. Hanoi Tower Sequence
最新推荐文章于 2018-02-28 12:31:03 发布