目录
1.题目描述
问题 Q: 最接近
时间限制: 1.000 Sec 内存限制: 128 MB题目描述
小明同学最近正在研究一些幂次的特性,比如 32 = 9 和 43 = 64。
小花是小明的好朋友,她总是和小明一起学习,由于小花刚刚学习幂次,很多计算还不太熟练。她很好奇,对于任意给出的正整数 N,不超过 N 的最大的 2 的幂次方的数是多少?
例如:如果 N 等于 10,那么不超过 10 的最大的 2 的幂次方的整数就是 8,如果 N 是 100,那么不超过 100 的最大的 2 的幂次方的整数就是 64。小花希望你能帮助她解决这个问题。如果你能解决这个问题,就能和小花成为好朋友,小花希望朋友越多越好。
输入
输入只有一行一个正整数 N。
输出
输出只有一行一个正整数,表示不超过 N 的最大的 2 的幂次方的正整数。
样例输入 Copy
【输入样例 1】
10
【输入样例2】
100
样例输出 Copy
【输出样例1】
8
【输出样例2】
64
提示
【样例1解释】
不超过 10 的 2 的幂次方的正整数有 20 = 1,21 = 2,22 = 4,23 = 8,答案是 8。
【样例2解释】
不超过 100 的 2 的幂次方的正整数有 20 = 1,21 = 2,22 = 4,23 = 8,24 = 16,25 = 32,26 = 64,答案是 64。
【数据范围】
对于 100% 的数据,保证 1 ≤ N ≤ 1018。
2.代码
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
long long n;
cin>>n;
long long left = 1;
long long right = 60;
while(left<=right)
{
long long mid = left + (right - left) / 2;
long long ans = pow(2, mid);
if(ans>n)
{
right = mid - 1;
}
else if(ans<n)
{
if(pow(2,mid+1)>n)
{
cout<<ans;
return 0;
}
left = mid + 1;
}
else
{
cout<<ans;
return 0;
}
}
}