1.1 一个神奇的故事
小明最近迷上了一款猜数字游戏。游戏规则很简单:电脑随机想一个1到100的数字,小明来猜,电脑会告诉他"大了"还是"小了"。
第一次玩,小明从1开始猜:1、2、3、4...猜了好久才猜到。
后来,小明想到一个聪明的办法:
-
先猜50(中间的数)
-
如果大了,就猜25(50的一半)
-
如果小了,就猜75
-
每次都猜中间的数...
+------------------------------------------+
|
| 小明的发现:
|
| 用"每次猜中间"的方法,
| 最多只需要7次就能猜中!
|
| 这就是数学的力量!
|
+------------------------------------------+
你知道吗?小明发现的这个方法叫做**"二分查找"**,是程序员经常用的技巧。而这个技巧的背后,藏着数学的秘密!
1.2 数学在编程中无处不在
你可能觉得编程就是敲代码,和数学没什么关系。但其实,数学就像空气一样,虽然看不见,却无处不在!
生活中的例子
| 你做的事情 | 用到的数学 |
|---|---|
| 玩游戏算伤害值 | 加减乘除 |
| 给同学分糖果 | 除法、余数 |
| 设置密码锁 | 排列组合 |
| 看日历算天数 | 日期计算 |
| 画图形 | 坐标、几何 |
编程中的例子
+------------------------+ +------------------------+
| 数学知识 | | 编程应用 |
+------------------------+ +------------------------+
| 整数除法和余数 | --> | 判断奇偶、拆分数字 |
| 因数和倍数 | --> | 分组问题 |
| 素数 | --> | 密码学、加密 |
| 坐标系 | --> | 游戏角色位置 |
| 排列组合 | --> | 密码可能性 |
+------------------------+ +------------------------+
1.3 为什么程序员需要数学?
原因一:让程序更聪明
还记得小明的猜数字吗?
不用数学的方法:
c
// 从1猜到100,最坏要猜100次
for (int i = 1; i <= 100; i++) {
if (i == answer) {
printf("猜到了!是%d\n", i);
}
}
用数学的方法:
c
// 二分查找,最多只要7次
int low = 1, high = 100;
while (low <= high) {
int mid = (low + high) / 2;
// 每次排除一半的可能
}
💡 数学让程序从"笨办法"变成"聪明办法"!
原因二:解决复杂问题
有些问题,不用数学根本没法解决。
例子:计算器
如果没有数学,我们怎么知道 123 + 456 等于多少?
c
int a = 123;
int b = 456;
int sum = a + b; // 数学告诉我们:答案是579
原因三:验证答案对不对
数学可以帮我们检查程序写得对不对。
例子:等差数列求和
老师说:1 + 2 + 3 + ... + 100 = 5050
我们可以写程序验证:
c
#include <stdio.h>
int main() {
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum = sum + i;
}
printf("1到100的和是:%d\n", sum);
return 0;
}
运行结果:1到100的和是:5050 ✓
💡 代码和数学公式得出相同答案,说明都是对的!
1.4 本书会学到什么?
让我们看看这本书的"藏宝图":
你现在在这里
↓
+---------------+
| 第一章 |
| 数学与编程 |
+---------------+
|
+-----------+-----------+
↓ ↓
+--------+ +--------+
| 第二章 | | 第三章 |
| 整数 | | 奇偶 |
+--------+ +--------+
| |
+-----------+-----------+
|
+-----------+-----------+
↓ ↓
+--------+ +--------+
| 第四章 | | 第七章 |
| 因数 |------------->| 素数 |
| 倍数 | | |
+--------+ +--------+
|
+---+---+
↓ ↓
+----+ +----+
|GCD | |LCM |
|五章| |六章|
+----+ +----+
... 更多精彩内容 ...
学习内容概览
| 章节 | 学什么 | 有什么用 |
|---|---|---|
| 第二章 | 整数运算 | 拆分数字、判断整除 |
| 第三章 | 奇偶性 | 快速判断、找规律 |
| 第四章 | 因数倍数 | 分组、分配问题 |
| 第五章 | 最大公因数 | 分数约分 |
| 第六章 | 最小公倍数 | 周期问题 |
| 第七章 | 素数 | 密码学基础 |
| 第八章 | 计数原理 | 算可能性 |
| 第九章 | 等差数列 | 快速求和 |
| 第十章 | 翻倍 | 增长问题 |
| 第十一章 | 排列组合 | 选择问题 |
| 第十二章 | 日期时间 | 日历计算 |
| 第十三章 | 数位分析 | 数字游戏 |
| 第十四章 | 统计 | 数据分析 |
| 第十五章 | 坐标 | 位置和距离 |
| 第十六章 | 综合挑战 | 实战应用 |
1.5 学习方法:不要背,要理解!
❌ 错误的学习方法
+--------------------------------+
|
| 死记硬背公式
| 不理解就做题
| 害怕出错
|
+--------------------------------+
✅ 正确的学习方法
+--------------------------------+
|
| 1. 先听故事,理解场景
| 2. 动手画图,亲自体验
| 3. 写代码验证,加深理解
| 4. 做题巩固,不怕出错
|
+--------------------------------+
一个例子:理解"余数"
死记硬背: 17 ÷ 5 = 3...2,余数是2。背下来!
理解方法:
想象你有17块糖,要分给5个小朋友...
糖果:🍬🍬🍬🍬🍬 🍬🍬🍬🍬🍬 🍬🍬🍬🍬🍬 🍬🍬
分给5人:
小明:🍬🍬🍬
小红:🍬🍬🍬
小华:🍬🍬🍬
小李:🍬🍬🍬
小王:🍬🍬🍬
剩下:🍬🍬 ← 这就是余数!
用代码验证:
c
int candy = 17;
int people = 5;
int each = candy / people; // 每人3块
int remain = candy % people; // 剩余2块
printf("每人%d块,剩余%d块\n", each, remain);
💡 理解了"为什么",就永远不会忘记!
1.6 动手试一试
实验1:感受数学的力量
用两种方法找出1到1000中有多少个7的倍数:
方法一:一个一个数(笨办法)
c
#include <stdio.h>
int main() {
int count = 0;
for (int i = 1; i <= 1000; i++) {
if (i % 7 == 0) {
count++;
}
}
printf("笨办法:有%d个\n", count);
return 0;
}
方法二:用数学(聪明办法)
c
#include <stdio.h>
int main() {
// 1000 ÷ 7 = 142...6
// 所以有142个7的倍数
int count = 1000 / 7;
printf("聪明办法:有%d个\n", count);
return 0;
}
两种方法答案一样,但第二种快多了!
实验2:验证一个数学规律
老师说:"任意两个连续整数相乘,结果一定是偶数。"
真的吗?让我们写程序验证:
c
#include <stdio.h>
int main() {
printf("验证:连续两个数的乘积是否都是偶数\n\n");
for (int n = 1; n <= 10; n++) {
int product = n * (n + 1);
printf("%d × %d = %d", n, n + 1, product);
if (product % 2 == 0) {
printf(" ✓ 是偶数\n");
} else {
printf(" ✗ 是奇数\n");
}
}
return 0;
}
运行结果:
验证:连续两个数的乘积是否都是偶数
1 × 2 = 2 ✓ 是偶数
2 × 3 = 6 ✓ 是偶数
3 × 4 = 12 ✓ 是偶数
4 × 5 = 20 ✓ 是偶数
5 × 6 = 30 ✓ 是偶数
...
全部都是偶数!老师说得对!
💡 为什么? 因为两个连续的数,必有一个是偶数。偶数乘任何数都是偶数!
1.7 本章小结
+----------------------------------------+
|
| 本章我们学到了:
|
| 1. 数学是编程的好朋友
|
| 2. 数学让程序更聪明、更快
|
| 3. 用代码可以验证数学规律
|
| 4. 学数学要理解,不要死记
|
+----------------------------------------+
1.8 练习题
练习1:思考题
为什么小明用"每次猜中间"的方法,最多只需要7次就能猜中1到100之间的数?
提示: 想想每猜一次,剩下多少个可能的数。
练习2:验证规律
写程序验证:"1到100中,3的倍数有33个"。
练习3:发现规律
运行下面的程序,观察输出,你发现了什么规律?
c
#include <stdio.h>
int main() {
for (int n = 1; n <= 10; n++) {
int square = n * n;
printf("%d 的平方 = %d\n", n, square);
}
return 0;
}
练习4:挑战题
用程序计算:1 + 3 + 5 + 7 + ... + 99(所有小于100的奇数之和)
然后想一想,有没有更快的计算方法?
练习5:生活应用
如果你有23块饼干,要平均分给4个小朋友,每人能分几块?还剩几块?
用程序算一算,然后画图验证。
1.9 亲子活动:数学魔术
魔术:我能猜到你的答案!
表演方法:
- 让孩子心里想一个1到10的数
- 把这个数乘以2
- 加上10
- 除以2
- 减去最开始想的数
神奇的结果: 不管孩子想的是几,答案永远是5!
揭秘(用数学解释):
设想的数是 n
- 乘以2:2n
- 加上10:2n + 10
- 除以2:n + 5
- 减去n:5
所以答案永远是5!
动手验证:
c
#include <stdio.h>
int main() {
printf("验证数学魔术:\n\n");
for (int n = 1; n <= 10; n++) {
int step1 = n * 2; // 乘以2
int step2 = step1 + 10; // 加上10
int step3 = step2 / 2; // 除以2
int step4 = step3 - n; // 减去原数
printf("想的数是%d,最后答案是%d\n", n, step4);
}
return 0;
}
试一试: 你能设计一个自己的数学魔术吗?
下一章预告: 整数运算的魔法------加减乘除背后的秘密!