Description
给你一个数N,请你找出最大的的整数k,满足 2k ≤ N
Input
1 ≤ N ≤ 1019
Output
输出k并换行
Sample Input
6
Sample Output
2
Hint
注意精度问题
储备知识 – C/C++四种取整函数
处理浮点数操作常常用到取整函数,C/C++提供了四种取整函数 当然这四种函数都需要头文
#include<math.h>
floor函数:向下取整函数,或称为向负无穷取整
double floor(double x);
//举例:floor(-5.7) == -6
ceil函数:向上取整函数,或称为向正无穷取整
double ceil(double x);
//举例:ceil(-5.5) == -5
trunc函数:舍尾取整函数,或称为向零取整
trunc(1.9) == 1
trunc(1.4) == 1
trunc(-1.4) == -1
trunc(-1.9) == -1
round函数:四舍五入函数
可以先不考虑负号,四舍五入得到结果
round(1.1) == 1
round(1.7) == 2
round(-2.3) == -2
round(-2.6) == -3
如果要用小数部分来理解这一块的内容,其实是很繁琐的中学数学书里面的定义,-1.5的整数部分是-2,小数部分是0.5,整数部分也就是floor()
//数学方法:log2(N)=log(N)/log(2)
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
double num;
cin >> num;
cout << floor(log(num) / log(2)) << endl;//对结果向下取整
return 0;
}
//逼近比较:当出现2^i<=num且2^(i+1)>num时返回i
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
long long num, k = 1;
cin >> num;
for (int i = 1;; i++)
{
if (pow(2, i) <= num && pow(2, i + 1) > num)
{
cout << i << endl;
break;
}
}
return 0;
}
//枚举测试,移位运算比较
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef unsigned long long ULL;
ULL num;
int main()
{
while (scanf("%llu", &num) != EOF)
{
int k = 0;
ULL x = 1;
for (; x <= num; x <<= 1, k++)
{
}
printf("%d\num", k - 1);
}
return 0;
}