CC++ & Algorithm

加减乘除之外:C++运算符中的数学智慧

你有没有遇到过这种情况?去超市买三包薯片,每包8.5元,收银员告诉你一共25.5元。你心里飞快地算了一遍——三包,每包8块5,三包就是25块5,没错。这个瞬间,你的大脑就用到了加法、乘法。生活中,算术无处不在;而在C++里,算术运算符就是把这些数学直觉翻译成计算机能理解的语言。

C++的算术运算符和数学课本上差不多:+ - * / %,但有几个细节值得注意。乘法用星号而不是叉号,除法则用斜杠。最容易被初学者绊倒的是整数除法——7 / 2的结果是3,不是3.5。因为两边都是整数,C++会直接截断小数部分。想得到小数?至少一边用浮点数:7.0 / 2

还有一个独特的运算符叫取余数%,它返回除法剩下的部分。比如10 % 3得到1,因为10除以3等于3余1。这看起来像是“附属品”,但在编程中却超乎寻常地有用。


举个例子:求任意三位数各个数位上数字的和。输入一个三位数,比如123,输出1+2+3=6。怎么拆出每一位呢?用除法和取余。

假设数字x=123。我们要得到百位、十位、个位。百位:x / 100得到1;个位:x % 10得到3;十位:(x / 10) % 10,先除以10得到12,再对10取余得到2。你看,除法和取余配合,完美提取数位。

int x = 123;
int bai = x / 100;          // 1
int shi = (x / 10) % 10;    // 2
int ge = x % 10;            // 3
int sum = bai + shi + ge;   // 6

这个思路在很多数字处理题目中都会用到,比如判断回文数、数字反转,本质上都是通过除法和取余来“拆解”数字。


再来看一个更复杂的场景:小X与机器人。机器人只能沿着棋盘边框移动,从一点到另一点,求最少步数。棋盘是19×19,边框就是四条边:第1行、第19行、第1列、第19列。起点和终点都在边框上。问题可以简化成:在边框这个“一维环”上找最短路径。

怎么算?先判断两点是否在同一条边上,如果在同一条边上,步数就是横坐标或纵坐标的差值;如果不在同一条边上,机器人需要先拐到角点,再沿另一条边前进。具体来说,四个边框可以映射成一条拉直的线段:从(1,1)沿边框顺时针绕一圈到(19,1)。每个点对应一个“一维坐标”,然后用两点的“一维距离”取最小值(因为可以顺时针或逆时针走)。

这里就用到了加减法和绝对值比较。比如计算两个点的曼哈顿距离?不,边框上只有两个方向,所以是二维坐标差值的组合。核心代码:

int dist(int x1, int y1, int x2, int y2) {
    // 如果两点在同一边,直接算
    if (x1 == 1 && x2 == 1) return abs(y2 - y1);
    if (x1 == 19 && x2 == 19) return abs(y2 - y1);
    if (y1 == 1 && y2 == 1) return abs(x2 - x1);
    if (y1 == 19 && y2 == 19) return abs(x2 - x1);
    // 否则,找四个角作为中转点,取最短路径
    int cornerDist[4] = {
        (x1-1) + (y1-1) + (x2-1) + (y2-1),          // 左下角(1,1)
        (x1-1) + (19-y1) + (x2-1) + (19-y2),       // 右下角(1,19)
        (19-x1) + (y1-1) + (19-x2) + (y2-1),      // 左上角(19,1)
        (19-x1) + (19-y1) + (19-x2) + (19-y2)     // 右上角(19,19)
    };
    int ans = 1e9;
    for (int i = 0; i < 4; i++) ans = min(ans, cornerDist[i]);
    return ans;
}

虽然这个例子用到了更复杂的逻辑,但底层还是那些基本的算术运算符。加减法计算曼哈顿距离,取绝对值确保非负,最小值比较帮你选出最佳路径。


最后来两个小测试,看看你是否真的理解了:

  1. 7 % 3的结果是多少?——答案是1,因为7除以3余1。
  2. 以下哪个表达式在C++中的值等于15?
    A. 3 * 5
    B. 30 / 2
    C. 10 + 5
    D. 16 - 1

所有选项都等于15?别急,整数除法30 / 2结果是15,没错。但注意如果写成30 / 2.0就会得到15.0,是double类型。在整数上下文中,30 / 2返回int型15。所以全部正确——只要你区分好数据类型。

其实核心就一句话:算术运算符是把数学逻辑映射到代码世界的桥梁。理解它,不仅是记住符号,更是懂得什么时候用除法、什么时候用取余、什么时候考虑精度。

如果你刚开始接触C++,建议花点时间自己测试不同组合,特别是整数除法和小数除法的区别。试着写一个小程序,输入任意三位数输出各位之和,或者动手计算一下机器人走边框的步数。实践是最好的老师。


关于作者

我是赵老师,持有 NOI 信息学奥赛教练证书,拥有 15 年以上的软件开发经验,从事信息学少儿编程教学已有 8 年时间。

这些年累计帮助 多名 学生通过编程特长升入自己心仪的目标学校。

如果你在编程学习上有任何疑问,欢迎联系我:18620372957(微信同号)

这篇文章对你有帮助吗?

有用 100%没用 0%

想系统学习这个知识点?查看完整知识点 →