GESP7级C++考试语法知识(二、指数函数(1、pow() 函数)

GESP7级C++考试语法知识(二、指数函数(1、pow() 函数) 数学魔法函数学院 第五课《细胞分裂大作战——指数增长》本课任务今天我们将进入一个全新的王国 指数函数王国这里没有风车。没有炮台。没有 sin。没有 cos。这里最厉害的魔法只有一个✨复制魔法学完本课后你将掌握✅ 什么是指数增长✅ 什么是指数函数✅ C中的pow()函数✅ 如何解决翻倍问题✅ 如何建立指数模型✅ 学会看到“翻倍”、“倍增”就想到指数第一章神奇细胞实验室1、一天。阿Q来到皇家实验室。里面有一个神奇细胞2、科学家说这个细胞每过1小时都会复制出一个自己。3、刚开始1个细胞11小时后2个细胞22小时后4个细胞33小时后8个细胞44小时后16个细胞4、阿Q开始记录时间小时细胞数量011224384165、突然阿Q发现每次都是×2第二章发现规律1、继续往后推1第5小时16 × 2 322第6小时32 × 2 643第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、整理小时数量02⁰12¹22²32³42⁴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输入52输出32第九章金币翻倍挑战1、阿Q发现一个神奇宝箱。第一天1金币每天翻倍。第二天2第三天4第四天8第五天162、第十天呢答案2⁹ 5123、为什么不是2¹⁰因为第一天已经有1个金币。这个问题特别容易出错。第十章指数增长有多可怕1、国王说我给你两个奖励。方案A100万元直接给你。方案B第一天1元 以后每天翻倍 连续30天2、很多同学选A。3、实际上第30天2²⁹ 536870912约5亿多元远远超过100万这就是指数增长的威力第十一章竞赛中的指数问题以后会遇到1、汉诺塔移动次数2^n-12、满二叉树第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 i1;in;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 ans1; for(int i1;in;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}这样的超级大指数这才是竞赛中的标准做法。下一课⚔️《超级银行家——复利增长》⚔️我们将学习利滚利复利公式指数函数真正的威力并且第一次接触现实世界中的指数模型。