单字节所有的元素都是正数。
唯一要注意的一点就是需要循环起来,不循环起来,测试不能通过。
#include<iostream>
using namespace std;
int main()
{
int d;
while(cin >>d)
{
int flag1 = 0;
int count = 0;
int max = count;
int e;
while(d != 0)
{
e = d % 2;
d = d / 2;
if(e == 1)
{
count++;
if(max < count)
max = count;
}
else
{
count = 0;
}
}
cout<<max<<endl;
}
return 0;
}
class LCA {
public:
int getLCA(int a, int b) {
if (a < b) //较小结点
{
swap(a, b);
}
int num1 = 1;
int num2 = 1;
while (num2 < b) //确定较小结点在那一层
{
num2 = (num1 * 2) - 1;
num1 = num1 * 2;
}
while (a > num2) //较大节点和较小结点移动到同一层
{
a = a / 2;
}
while (a != b) //一起向上走
{
a = a / 2;
b = b / 2;
}
return a;
}
};
思路就是
1.先拿到两个节点中的较小值,然后使用2^-1这个规律,来算本层的最后一个结点的编号
2.确定两个节点中较小结点在哪一层
3.让两个节点中的较大节点先和小结点移动到同一层
4.然后两个节点同时向上走就可以确定最近公共祖先,公式是,(子结点编号 / 2 )拿到父节点,两个一起向上走。
因为题目中说了是满二叉树,才可以这样做