第一章:数学是编程的好朋友

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. 让孩子心里想一个1到10的数
  2. 把这个数乘以2
  3. 加上10
  4. 除以2
  5. 减去最开始想的数

神奇的结果: 不管孩子想的是几,答案永远是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;
}

试一试: 你能设计一个自己的数学魔术吗?


下一章预告: 整数运算的魔法------加减乘除背后的秘密!