0
点赞
收藏
分享

微信扫一扫

第一周算法设计与分析:A : log2(N)

践行数据分析 2022-03-11 阅读 50

一、题目大意

输入一个数N,要求输出log2N(向下取整)

二、思路

1、储备知识:

a、四种取整函数

函数功能例子
floor ()向负无穷取整floor(2.5)=2,floor(-2.4)=-3
ceil()向正无穷取整ceil(2.5)=3,ceil(-2.4)=-2
trunc()向零取整trunc(2.5)=2,trunc(-2.4)=-2
round()四舍五入round(2.5)=3,round(-2.4)=-2

b.对数函数log()与指数函数pow()

函数功能例子
log(N)输出以e为底N的对数log(2.7)=0.993252
pow(a,n)输出底数为a的n次方pow(2,3)=8

注1:以上6种函数头文件:#include<math.h>
注2:数学上log26=log(6)/log(2)(要实现数学上的对数,可以用商来表示)
注3:如果可以尽量全都敲一遍,巩固记忆。

2、思路

模拟逼近运算,将输入的数字num循环与20~264比较,当出现有2i>num时
则必然存在:num>=2i-1

思路A

#include<iostream>
using namespace std;
int main()
{
    long long n,ans=1;
    cin>>n;
    for(int i=0;i<=64;i++)
    {
        if(n<ans){cout<<i-1<<endl;break;}
        ans*=2;
    }
    return 0;
}

思路B

将log2(N)转化成log(2)/log(N)
然后再向下取整。也就是使用floor函数
对应代码如下。

#include<iostream>
#include<math.h>
using namespace std;
int main()
{
    double n;
    cin>>n
    cout<<floor(log(n)/log(2))<<endl;
    return 0;
}

思路C

输入一个数n后,循环到0~63,当pow(2,i)大于n时输出i-1,原理等同于思路A

#include<iostream>
#include<math.h>
using namespace std;
int main()
{
    long long n;
    cin>>n;
    for(int i=0;i<=64;i++)
        if(n<pow(2,i)){cout<<i-1<<endl;break;}
    return 0;
}

思路B与思路C两个代码逻辑上没有问题,但由于log()与pow()内的参数为浮点数,在转化成整数的时候可能会出现精度丢失的问题,如果出题人恶意卡人是可能会wa的,所以在需要取整的时候幂函数和对数函数最好不用,而是全用整数。

举报

相关推荐

第一周

第一周编程

打卡第一周

第一周学习

第一周(二)

第一周考试

0 条评论