🌟数学魔法函数学院 第五课
《细胞分裂大作战——指数增长》
本课任务
今天,我们将进入一个全新的王国:
🏰 指数函数王国
这里没有风车。
没有炮台。
没有 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 = 1282、阿Q发现:
1 2 4 8 16 32 64 128越来越快!
3、这时候国王说:
这种增长方式,
就叫指数增长!
第三章:什么是指数?
1、观察:
1可以写成:
2⁰因为:
2⁰ = 12、继续:
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结果:
42³意思:
2 × 2 × 2结果:
82⁵意思:
2×2×2×2×2结果:
32第五章:指数魔法树
1、想象有一棵复制树:
第一层 1 第二层 1 1 第三层 1 1 1 1 第四层 1 1 1 1 1 1 1 12、数量:
1 2 4 8 16 323、每一层:
×2这就是指数增长。
第六章:C++中的指数函数
1、问题来了。
如果想计算:
2¹⁰怎么办?
当然可以写:
2*2*2*2*2*2*2*2*2*2但是太麻烦了!
2、C++提供了指数函数:
pow()3、语法:
pow(a,b)表示:
a^b4、例如:
pow(2,3)表示:
2³结果:
8第七章:第一个pow程序
#include <iostream> #include <cmath> using namespace std; int main() { cout << pow(2,3); return 0; }输出:
8第八章:细胞分裂模拟器
1、输入:
n2、表示:
经过n小时3、输出:
细胞数量4、根据规律:
2^n5、代码:
#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第五天:
162、第十天呢?
答案:
2⁹ = 5123、为什么不是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、数学上:
指数表示:
连续乘多少次。
例如:
2^5= 2 * 2 * 2 * 2 * 2 //5个2相乘2、程序中:
pow(a,b)表示:
a^b3、重要思想:
看到“每次乘同一个数”,就要想到指数增长。
竞赛提高篇:
一、pow(a,b) 的返回值是什么类型?
1、有的同学以为:
pow(2,10)返回的是:
int实际上不是!
2、C++中的pow()定义在:
#include <cmath>其主要返回类型是:
double例如:
cout << typeid(pow(2,10)).name();得到的是:
double3、例如:
#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 大约能表示:
10 ^ -308 ~ 10 ^ 3083、也就是说:
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 long2、范围:
-2^63 ~ 2^63-13、约等于:
-9.22×10^18 到 9.22×10^184、所以:
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}
这样的超级大指数,这才是竞赛中的标准做法。
下一课:
⚔️《超级银行家——复利增长》⚔️
我们将学习:
利滚利
复利公式
指数函数真正的威力
并且第一次接触现实世界中的指数模型。🚀