题目传送门:Raising Bacteria
//问题描述:一个盒子里面放一个细菌在一天可以增生两个细菌。 现在已知盒子里面细菌的个数,问你最初放多少个细菌可以增生盒子里面的细菌数量
//输入:盒子中细菌的数量
//输出:最初至少放的细菌数量
//算法分析:从2开始累乘过程计数!
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL ;
int jisuan(LL n)
{
int num = 0;
LL flag = 2;
while (1)
{
if (n == 1)
{
num ++ ;
break;
}
flag = 2;
while (flag < n)
{
flag = flag * 2;
}
if (flag == n)
{
num ++ ;
break;
}
else
{
flag = flag / 2;
n = n - flag;
num ++ ;
}
}
return num ;
}
int main()
{
LL n;
while (cin >> n)
{
cout << jisuan(n) << endl;
}
return 0;
}
//本题可以用位运算来求解,每次数量翻倍,都会左移。1的数量会保持不变,也就是1的数量一定是添加进去的,即数二进制1的数量即可