问题 Q: 最接近(C++)

目录

1.题目描述

 2.代码


1.题目描述

问题 Q: 最接近

时间限制: 1.000 Sec  内存限制: 128 MB
 

题目描述

小明同学最近正在研究一些幂次的特性,比如 32 = 9 和 43 = 64。

小花是小明的好朋友,她总是和小明一起学习,由于小花刚刚学习幂次,很多计算还不太熟练。她很好奇,对于任意给出的正整数 N,不超过 的最大的 2 的幂次方的数是多少?

例如:如果 等于 10,那么不超过 10 的最大的 2 的幂次方的整数就是 8,如果 是 100,那么不超过 100 的最大的 2 的幂次方的整数就是 64。小花希望你能帮助她解决这个问题。如果你能解决这个问题,就能和小花成为好朋友,小花希望朋友越多越好。
 

输入

输入只有一行一个正整数 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;
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值