信奥崔老师:算术运算

79 阅读4分钟

算术运算 (Arithmetic Operations)

1. 概念介绍

图片

算术运算是编程中最基本、最常见的运算,用于执行基本的数学计算。它们对数字(整数或浮点数)进行操作,并返回一个数字结果。

  • 加法 (+) : 两数相加。
  • 减法 (-) : 两数相减。
  • 乘法 (*) : 两数相乘。
  • 除法 (/) : 两数相除。
    • 如果操作数均为整数,则执行整除,结果的小数部分被舍弃。例如 7 / 3 结果是 2
    • 如果至少有一个操作数是浮点数,则执行浮点除法。例如 7.0 / 3 结果是 2.333...
  • 求余/取模 (%) : 计算第一个操作数除以第二个操作数后的余数。此运算仅适用于整数。例如 7 % 3 结果是 1

2. 算法步骤

算术运算的执行遵循标准的数学运算顺序(PEMDAS/BODMAS):

  1. 括号 () : 首先计算括号内的表达式。
  2. 乘 *、除 /、求余 % : 这些运算符优先级相同,从左到右计算。
  3. 加 +、减 -: 这些运算符优先级相同,从左到右计算。

例如,计算 a + b * c 时,会先计算 b * c,然后将结果与 a 相加。

3. 算法可视化SVG图示

下图展示了一个典型的二元算术运算流程:两个输入(操作数)经过一个运算符处理,得到一个输出(结果)。

图片

4. 核心特性

  • 优先级: 乘、除、模运算的优先级高于加、减。
  • 结合性: 都是从左到右结合(a - b - c 等同于 (a - b) - c)。
  • 类型提升: 当不同类型的数字一起运算时,较小的类型会自动提升为较大的类型。例如,int 和 double 运算,int 会先被转换为 double,结果也是 double
  • 整数溢出: 当运算结果超出该整数类型能表示的范围时,会发生溢出,导致结果不正确(通常是回绕,例如最大整数加1变成最小整数)。

5. C++代码基础实现

#include <iostream>

int main() {
    int a = 10, b = 3;
    double c = 10.0, d = 3.0;

    // 加法
    std::cout << "a + b = " << (a + b) << std::endl// 13

    // 减法
    std::cout << "a - b = " << (a - b) << std::endl// 7

    // 乘法
    std::cout << "a * b = " << (a * b) << std::endl// 30

    // 整除
    std::cout << "a / b = " << (a / b) << std::endl// 3

    // 浮点除法
    std::cout << "c / d = " << (c / d) << std::endl// 3.33333

    // 求余
    std::cout << "a % b = " << (a % b) << std::endl// 1

    return 0;
}

6. 优化策略

  • 避免不必要的浮点运算: 整数运算通常比浮点运算快得多。如果问题可以用整数解决,尽量避免使用 double 或 float
  • 使用位运算替代: 对于乘以或除以2的幂次方的运算,可以使用位移运算(见后文),效率更高。例如 x * 2 可以写成 x << 1
  • 注意数据类型: 在处理大数时,使用 long long 防止 int 溢出。

7. 优缺点

  • 优点: 直观,符合数学直觉,是所有计算的基础。
  • 缺点:
    • 精度问题: 浮点数运算存在精度误差。
    • 溢出问题: 整数运算有范围限制,可能导致溢出。
    • 除以零: 除数为零会导致运行时错误。

8. 应用场景

  • 数值计算: 几乎所有的科学计算、数据分析、金融建模等。
  • 计数与统计: 计算总和、平均值、频率等。
  • 几何问题: 计算坐标、距离、面积等。
  • 算法基础: 递推、迭代、动态规划等算法中频繁使用。

9. 扩展

  • 复合赋值运算符+=-=*=/=%=。例如 a += b 等价于 a = a + b
  • 数学库 <cmath> : 提供更复杂的数学函数,如 pow(x, y) (幂), sqrt(x) (平方根), sin(x) (正弦)等。

10. 课后配套练习及答案

练习1: A+B 问题输入两个整数a和b,输出它们的和。

// 答案
#include <iostream>
int main() {
    int a, b;
    std::cin >> a >> b;
    std::cout << a + b << std::endl;
    return 0;
}

练习2: 矩形周长和面积输入矩形的长和宽(整数),计算并输出其周长和面积。

// 答案
#include <iostream>
int main() {
    int length, width;
    std::cin >> length >> width;
    int perimeter = 2 * (length + width);
    int area = length * width;
    std::cout << "Perimeter: " << perimeter << std::endl;
    std::cout << "Area: " << area << std::endl;
    return 0;
}

练习3: 苹果和盘子有m个苹果,n个盘子。将苹果平均分到盘子里,计算每个盘子分到多少个苹果,还剩下多少个?

// 答案
#include <iostream>
int main() {
    int apples, plates;
    std::cin >> apples >> plates;
    int per_plate = apples / plates;
    int remaining = apples % plates;
    std::cout << "Apples per plate: " << per_plate << std::endl;
    std::cout << "Remaining apples: " << remaining << std::endl;
    return 0;
}

练习4: 华氏度转摄氏度输入一个华氏温度F,根据公式 C = 5/9 * (F-32) 计算并输出摄氏温度C。注意整数除法问题。

// 答案
#include <iostream>
#include <iomanip> // 用于设置输出精度
int main() {
    double fahrenheit;
    std::cin >> fahrenheit;
    // 必须使用浮点数进行计算,否则 5/9 会变成 0
    double celsius = 5.0 / 9.0 * (fahrenheit - 32);
    std::cout << std::fixed << std::setprecision(2) << celsius << std::endl;
    return 0;
}

练习5: 三位数各位数字之和输入一个三位正整数,计算并输出其个位、十位、百位数字之和。

// 答案
#include <iostream>
int main() {
    int num;
    std::cin >> num;
    int hundreds = num / 100;
    int tens = (num / 10) % 10;
    int ones = num % 10;
    int sum = hundreds + tens + ones;
    std::cout << "Sum of digits: " << sum << std::endl;
    return 0;
}

11. 相关网络资源推荐

  • C++ 运算符 - Cplusplus.com
  • 基本算术 - Khan Academy
  • C++ 算术运算符 - cppreference.com