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

100 篇文章 547 订阅 ¥999.99 ¥499.90

零、写在前面

  目前本专栏正在进行优惠活动,在博主主页添加博主好友(好友位没有满的话),可以获取 付费专栏优惠券
  从本节开始,我们就要开始 「 学习算法 」 了,很多没有接触过算法的同学都会问,没有任何基础,能学算法吗?我的回答是:没有任何一个人是没有任何基础的,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_cb}{log_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_2n}{log_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的幂★☆☆☆☆
👇🏻添加 博主 获取付费专栏优惠券👇🏻
  • 78
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 31
    评论
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

英雄哪里出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值