sicily 1028. Hanoi Tower Sequence

//从原序列中可以找出规律来:1 2 1 3 1 2 1 4 1 2 1 3 1 2 1 5 1 2 1 3 1 2 1 。。。
//可以看出:第2位是2,第4位是3,第8位是4,第16位是5,数字 k 第一次出现的位置是 2^(k-1)
//而且由于对称性,假若 k>8 且 k<16, 那么结果与 k-8 是相同的。
//当k=12时,即相当于k=12-8= 4 ,所以 1100 与 100 是一样的结果
//故我们只需找到该数的二进制表示的“1”出现的最低位
//把输入的十进制数转化成二进制数,从最低位开始,出现的第一个‘1’,该位的位置即为答案。
//比如100=2^2+2^5+2^6=1100100,所以是 3

#include
<iostream>
#include
<cstring>
#include
<stdio.h>
using namespace std;
void div(int list[],int& low,int high) //除以2,事先数组最后一位是偶数
{
for(int i=low;i<=high;++i)
if(list[i]>0)
{
if(list[i]%2==1)
list[i
+1]+=10;
list[i]
/=2;
}
if(list[low]==0)
low
++;
}
int main()
{
int t,list[101],x;
char ch[102];
cin
>>t;
for(int i=1;i<=t;++i)
{
scanf(
"%s",ch);
int len=strlen(ch);
for(int j=0;j<len;++j)
list[j]
=ch[j]-'0';
x
=1;
int beg=0;
//模拟十进制转化为二进制的过程,即不断除以2。当最后一位是奇数,余数肯定为1,此时找到最低位的“1”,结束循环
while(list[len-1]%2==0)
{
div(list,beg,len
-1);
x
++;
}
printf(
"Case %d: %d\n",i,x);
if(i<t)
printf(
"\n");
}
return 0;
}

posted on 2011-07-04 11:08  sysu_mjc  阅读(485)  评论(0编辑  收藏  举报

导航