时间限制 1000 ms
内存限制 64 MB
题目描述
初始有一个数n,每过一秒所有大于1的数x都会分裂成3部分:⌊x/2⌋ , x%2 , ⌊x/2⌋
问经过足够长的时间后,即所有的数都是0或1的时候,0的个数是多少
输入数据
一个正整数n,n<=1e12
输出数据
最终0的个数
样例输入
5
样例输出
2
样例说明
注意n要用long long存 样例解释: {5}-->{2,1,2}-->{1,0,1,1,1,0,1}
我首先想到的是用递归的方法,但是很明显当n过大时,就超时了。
后来我就想到,n mod 2可以用来判断奇偶,先判断奇偶再进行计算,这样就ac了
#include <iostream>
using namespace std;
long long fun(long long n)
{
if (n == 0)
return 1;
else if (n == 1)
return 0;
else if (n % 2 == 1)
return 2 * fun((n - 1) / 2);
else if (n % 2 == 0)
return 2 * fun(n / 2) + 1;
else
return 0;
}
int main()
{
long long n;
cin >> n;
cout << fun(n) << endl;
return 0;
}
多次 用到记忆化搜索
单次 用到递归