
🌟数学魔法函数学院 第五课
《细胞分裂大作战------指数增长》
本课任务
今天,我们将进入一个全新的王国:
🏰 指数函数王国
这里没有风车。
没有炮台。
没有 sin。
没有 cos。
这里最厉害的魔法只有一个:
✨ 复制魔法
学完本课后,你将掌握:
✅ 什么是指数增长
✅ 什么是指数函数
✅ C++中的
pow()函数✅ 如何解决翻倍问题
✅ 如何建立指数模型
✅ 学会看到"翻倍"、"倍增"就想到指数
第一章:神奇细胞实验室
1、一天。
阿Q来到皇家实验室。
里面有一个神奇细胞:
🦠
2、科学家说:
这个细胞每过1小时,
都会复制出一个自己。
3、刚开始:
1个细胞
(1)1小时后:
2个细胞
(2)2小时后:
4个细胞
(3)3小时后:
8个细胞
(4)4小时后:
16个细胞
4、阿Q开始记录:
| 时间(小时) | 细胞数量 |
|---|---|
| 0 | 1 |
| 1 | 2 |
| 2 | 4 |
| 3 | 8 |
| 4 | 16 |
5、突然阿Q发现:
每次都是:
×2
第二章:发现规律
1、继续往后推:
(1)第5小时:
16 × 2
=
32
(2)第6小时:
32 × 2
=
64
(3)第7小时:
64 × 2
=
128
2、阿Q发现:
1
2
4
8
16
32
64
128
越来越快!
3、这时候国王说:
这种增长方式,
就叫指数增长!
第三章:什么是指数?
1、观察:
1
可以写成:
2⁰
因为:
2⁰ = 1
2、继续:
2
=
2¹
4
=
2²
8
=
2³
16
=
2⁴
3、整理:
| 小时 | 数量 |
|---|---|
| 0 | 2⁰ |
| 1 | 2¹ |
| 2 | 2² |
| 3 | 2³ |
| 4 | 2⁴ |
4、规律出来了:
第n小时:
2^n
第四章:指数到底是什么意思?
1、很多同学会背:
2³ = 8
却不知道什么意思。
其实非常简单。
2、指数表示:
连续乘多少次。
例如:
2²
意思:
2 × 2
结果:
4
2³
意思:
2 × 2 × 2
结果:
8
2⁵
意思:
2×2×2×2×2
结果:
32
第五章:指数魔法树
1、想象有一棵复制树:
第一层
1
第二层
1 1
第三层
1 1 1 1
第四层
1 1 1 1 1 1 1 1
2、数量:
1
2
4
8
16
32
3、每一层:
×2
这就是指数增长。
第六章:C++中的指数函数
1、问题来了。
如果想计算:
2¹⁰
怎么办?
当然可以写:
2*2*2*2*2*2*2*2*2*2
但是太麻烦了!
2、C++提供了指数函数:
pow()
3、语法:
pow(a,b)
表示:
a^b
4、例如:
pow(2,3)
表示:
2³
结果:
8
第七章:第一个pow程序
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
cout << pow(2,3);
return 0;
}
输出:
8
第八章:细胞分裂模拟器
1、输入:
n
2、表示:
经过n小时
3、输出:
细胞数量
4、根据规律:
2^n
5、代码:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
cin >> n;
cout << pow(2,n);
return 0;
}
(1)输入:
5
(2)输出:
32
第九章:金币翻倍挑战
1、阿Q发现一个神奇宝箱。
第一天:
1金币
每天翻倍。
第二天:
2
第三天:
4
第四天:
8
第五天:
16
2、第十天呢?
答案:
2⁹
=
512
3、为什么不是2¹⁰?
因为:
第一天已经有1个金币。
这个问题特别容易出错。
第十章:指数增长有多可怕?
1、国王说:
我给你两个奖励。
方案A:
100万元
直接给你。
方案B:
第一天1元
以后每天翻倍
连续30天
2、很多同学选A。
3、实际上:
第30天:
2²⁹
=
536870912
约:
5亿多元
远远超过100万!
这就是指数增长的威力!
第十一章:竞赛中的指数问题
以后会遇到:
1、汉诺塔
移动次数:
2^n-1
2、满二叉树
第n层节点:
2^{n-1}
3、BFS扩散
感染人数翻倍
4、细胞分裂
数量增长
全部都是指数。
第十二章:pow()注意事项
1、有的同学写:
int x = pow(2,10);
2、结果:
1024
没问题。
3、但是:
pow(2,50)
数字会非常大。
4、使用pow()函数:
要使用:
long long
来存储结果。
本课总结
今天我们认识了指数王国最重要的魔法:
✨ 指数函数
1、数学上:
指数表示:
连续乘多少次。
例如:
cpp
2^5= 2 * 2 * 2 * 2 * 2 //5个2相乘
2、程序中:
pow(a,b)
表示:
a^b
3、重要思想:
看到"每次乘同一个数",就要想到指数增长。
竞赛提高篇:
一、pow(a,b) 的返回值是什么类型?
1、有的同学以为:
pow(2,10)
返回的是:
int
实际上不是!
2、C++中的 pow() 定义在:
#include <cmath>
其主要返回类型是:
double
例如:
cout << typeid(pow(2,10)).name();
得到的是:
double
3、例如:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
auto x = pow(2,10);
cout << x << endl;
return 0;
}
输出:
1024
虽然看起来像整数,
但实际上:
double x = 1024.0;
二、为什么竞赛中不建议大量使用 pow()?
1、因为:
pow()
是浮点运算。
2、例如:
cout << pow(2,50);
理论值:
1125899906842624
实际上存储的是:
double
存在误差。
3、所以竞赛里经常看到:
long long ans = 1;
for(int i=1;i<=n;i++)
ans *= 2;
而不是:
pow(2,n);
三、pow() 能算多大的数?
1、这要看 double 的范围。
2、double 大约能表示:
cpp
10 ^ -308 ~ 10 ^ 308
3、也就是说:
pow(10,300)
还能表示。
4、例如:
cout << pow(10,300);
没问题。
5、但是:
cout << pow(10,400);
就会输出:
inf
表示:
Infinity
无穷大。
因为超出 double 范围了。
四、竞赛里更关心的范围
1、虽然 double 能到:
10^308
但整数精度远远没那么大。
2、double 只有:
约15~16位有效数字
3、例如:
pow(2,100)
数值能表示。
但很多低位已经不准确了。
五、long long 能存多大?
1、很多竞赛题用的是:
long long
2、范围:
cpp
-2^63 ~ 2^63-1
3、约等于:
cpp
-9.22×10^18 到 9.22×10^18
4、所以:
2^60
≈
1.15×10^18
还能放进去。
2^63
就爆掉了。
六、常见竞赛结论
情况1
指数很小
例如:
pow(2,10)
pow(3,8)
可以直接用。
情况2
结果要作为整数参与判断
例如:
if(pow(2,n)==1024)
不推荐。
应该写:
long long ans=1;
for(int i=1;i<=n;i++)
ans*=2;
情况3
计算平方
不要写:
pow(x,2)
直接:
x*x
更快。
七、GESP和NOIP竞赛中的经验
1、要看指数大小
(1)可以放心使用
pow(2,10)
pow(3,5)
pow(5,6)
(2)需要小心
pow(2,50)
pow(3,30)
pow(10,18)
2、不建议用于精确整数计算
pow(2,n)
然后直接转:
long long
特别是:
n > 50
容易出问题。
3、给小学生的建议
(1)记住两个重点:
✅ 返回值是
double✅ 特别大的指数可能出现精度误差
(2)所以在信息学竞赛里:
求平方 →
x*x求整数次幂 → 循环乘法或快速幂
pow()更适合数学计算和演示指数概念
4、在算法提高阶段,我们专门学习一门神器:
⚔️《快速幂》⚔️
它能在 O(log n) 时间内计算:
2^{1000000000}
这样的超级大指数,这才是竞赛中的标准做法。
下一课:
⚔️《超级银行家------复利增长》⚔️
我们将学习:
利滚利
复利公式
指数函数真正的威力
并且第一次接触现实世界中的指数模型。🚀