《算法零基础100讲》(第1讲) 幂和对数

Posted 英雄哪里出来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《算法零基础100讲》(第1讲) 幂和对数相关的知识,希望对你有一定的参考价值。

零、写在前面

  从本节开始,我们就要开始 「 学习算法 」 了,很多没有接触过算法的同学都会问,没有任何基础,能学算法吗?我的回答是:没有任何一个人是没有任何基础的,1 + 1 总会吧 ?如果 1 + 1 都不会,可能都看不懂这段话😂。所以不要质疑自己的能力,学了再说,「 剩下的交给时间 」
  作为 「 零基础算法 」 的第一节,我会从从高中的 「 数学知识 」 开始着手讲。算法其实没有想象的那么高深,如果刚开始接触,最好能有一门语言作为基础,这里我推荐 C 语言,如果没有的话,我觉得问题也不大,一路学下去发现遇到问题以后,再去看相关语法,然后来回看,加深记忆。
  我的学习策略很简单 —— 题海策略。当然,这 100 题 如果都能够自己认认真真把代码写出来,那入门肯定是没问题了,至于后面的进阶就要看 「 个人的天赋 」 以及 「 后天的努力 」 了。

一、概念定义

  本文主要讲解 数学上 的 幂 和 对数 的概念,以及如何在程序中进行运用。

1、幂

  「 幂 」 是指数运算的结果。 n m n^m nm 看作乘方的结果,叫做 n n n m m m 次幂,也叫 n n n m m m 次方。
  当 m m m 为正整数时, n m n^m nm 代表 m m m n n n 相乘;
  当 m m m 为小数时, m m m 可以写成 a b \\frac a b ba (其中 a a a b b b 为整数), n m n^m nm 可以表示成: n m = n a b = n a b n^m = n^\\frac a b = \\sqrt[b]n^a nm=nba=bna
  在C语言中,我们可以利用函数pow(n,m)来计算 n n n m m m 次幂。

2、对数

  「 对数 」 是对 幂 的逆运算。当 n n n m m m 次方等于 T T T ( n > 0 n > 0 n>0,且 n ≠ 1 n \\neq1 n=1) ,即 T = n m T = n^m T=nm,那么数 m m m 叫做 “以 n n n 为底 T T T 的对数”,记作 m = l o g n T m = log_nT m=lognT。其中, n n n 叫做对数的 「 底数 」 T T T 叫做 「 真数 」

  在C语言中,我们可以利用函数log2(T)来计算以 2 2 2 为底 T T T 的对数;log10(T)来计算以 10 10 10 为底 T T T 的对数。

3、换底公式

  「 换底公式 」 常用于对数运算中,如下:
l o g a b = l o g c b l o g c a log_ab = \\frac log_cblog_ca logab=logcalogcb
  它的含义就是将底数从 a a a 换成了 c c c,证明比较简单,不再累述。所以在 C语言中,如果我们要求以 a a a 为底 b b b 的对数,只需要将底换成 2 2 2 求解即可:log2(b) / log2(a)

二、题目描述

  给定一个整数,写一个函数来判断它是否是 4 4 4 的幂。如果是,返回 true;否则,返回 false 。整数 n n n 4 4 4 的幂次方需满足:存在整数 x x x 使得 n = 4 x n = 4^x n=4x

三、算法详解

  根据上文中对数的定义, x x x 是以 4 为底 n n n 的对数,也就是 l o g 4 n log_4n log4n,利用换底公式,我们可以把它换成以 2 为底的方便程序计算,即: l o g 4 n = l o g 2 n l o g 2 4 log_4n = \\frac log_2nlog_24 log4n=log24log2n
  那么,我们可以求出 l o g 4 n log_4n log4n 的整数部分 x ′ x' x,如果 4 x ′ 4^x' 4x n n n 相等,则说明 n n n 是 4 的幂。这里需要注意,相等的判定是建立在浮点数之间的,两个浮点数的判等需要采用 如下方式: f a b s ( a − b ) < 0.00000001 fabs(a - b) < 0.00000001 fabs(ab)<0.00000001  即当两个数的差的绝对小于某个精度才认为它们相等。

四、源码剖析

bool isPowerOfFour(int n)
    if(n == 0) 
        return false;                          // (1)
    
    int x = (int)(log2(n) / log2(4) + 1e-8);   // (2)
    return fabs(n - pow(4, x)) < 1e-8;         // (3)

  • ( 1 ) (1) (1) n = 0 n=0 n=0 的情况特殊判定;
  • ( 2 ) (2) (2) 换底公式,并且加上一个精度,避免精度损失导致取整出错;
  • ( 3 ) (3) (3) 浮点数的相等判定;

五、推荐专栏

🧡《C语言入门100例》🧡

六、习题练习

序号题目链接难度
12的幂★☆☆☆☆
23的幂★☆☆☆☆
34的幂★☆☆☆☆
👇🏻 关注公众号 观看 精彩学习视频👇🏻

以上是关于《算法零基础100讲》(第1讲) 幂和对数的主要内容,如果未能解决你的问题,请参考以下文章

《算法零基础100讲》(第49讲) 位运算 (右移)

《算法零基础100讲》(第17讲) 线性枚举 - 最值算法

《算法零基础100讲》(第50讲) 位运算 (按位取反)

《算法零基础100讲》(第13讲) 最大公约数

《算法零基础100讲》(第32讲) 多维枚举 - 进阶

《算法零基础100讲》(第55讲) 哈希表入门