现有两个魔法机器,
A机器 会将投进去的X魔法币总数变为2*X +1
B机器会将投进去的X个魔法币总数变为2*X+2个
现小明拥有0个魔法币,需要n个魔法币,问应该如何依次投入保证刚好拥有n个魔法币:
加入现在小明需要10个魔法币,他先投入A机器,魔法币总数变为1个,再投入B机器,魔法币总数变为4个,再投入B机器,魔法币个数刚好变为10个,所以要输出的序列为ABB。
思路:
刚开始想从0开始算,但是发现行不通,需要逆向思维;
把自己想的画出来
先根据10找到其下标,跟下标找到值为4的点,再找其下标,最后找到下标为0就OK,思路可以,但实现起来不容易,经过大神指点,你讲其画成一个根节点为0的二叉树,再看你总结的规律。
画出二叉树如下:
左孩子节点与根节点的的规律为2*X+1;右孩子节点与根节点的规律为2*X+2;X为树的深度;
所以代码就很easy了;
int main()
{
int n = 0;
stack<char> s;
cin >> n;
while (n!=0)
{
if(n%2 == 0)
{
n = (n-2)/2;
s.push('B');
}
else
{
n = (n-1)/2;
s.push('A');
}
}
while (!s.empty())
{
cout<<s.top();
s.pop();
}
return 0;
}
OK