C++ 实例 – 求商及余数(一文讲透)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在编程世界中,数学运算是最基础却也最强大的工具之一。无论是开发游戏、数据分析还是系统工具,C++ 实例 – 求商及余数这一主题都扮演着重要角色。商和余数的计算看似简单,却能解决许多实际问题,例如时间转换、分页算法或密码学中的模运算。本文将通过循序渐进的方式,结合代码实例,帮助读者掌握这一核心技能,并理解其背后的逻辑。


基本运算符与基础概念

在 C++ 中,求商和余数分别使用 /% 运算符。这两个符号如同数学中的“除法”和“取模”操作,但需要注意它们在编程中的特殊规则。

1. 除法运算符 /

当使用 / 运算符时,结果会根据操作数的类型不同而变化:

  • 如果操作数是整数,则结果为整数商,即舍弃小数部分后的整数(向零取整)。
  • 如果操作数包含浮点数(如 double),则结果为精确的浮点数商。

示例代码 1:整数除法

#include <iostream>  
using namespace std;  

int main() {  
    int a = 10, b = 3;  
    cout << "商:" << a / b << endl;  // 输出 3(舍弃小数部分)  
    return 0;  
}  

2. 取余运算符 %

% 运算符返回余数,其符号与被除数(即左边的操作数)一致。例如:

  • 5 % 2 的结果是 1,因为 5 ÷ 2 的余数是 1。
  • -5 % 2 的结果是 -1,因为余数的符号与被除数(-5)一致。

示例代码 2:取余运算

#include <iostream>  
using namespace std;  

int main() {  
    int a = 7, b = 3;  
    cout << "余数:" << a % b << endl;  // 输出 1  
    return 0;  
}  

核心逻辑与数学关系

商和余数之间存在一个关键公式:
被除数 = 除数 × 商 + 余数
例如,7 = 3 × 2 + 1,其中商是 2,余数是 1。这一公式是理解运算符行为的核心。

为什么余数的符号与被除数一致?

想象一个“分配糖果”的场景:如果小明有 7 颗糖果,分给 3 个朋友,每人得到 2 颗,余下 1 颗;而如果小明欠朋友 7 颗糖果(即 -7 颗),按 3 个朋友分摊,每人需要还 3 颗(共 9 颗),则余数是 2 颗(即 -7 = 3 × (-3) + 2)。但 C++ 的规则是余数符号与被除数一致,因此 -7 % 3 的结果是 -1(因为 -7 = 3 × (-3) + (-1))。这种设计是为了保持公式的一致性。


实例演示:求商及余数的完整程序

接下来,我们将编写一个完整的 C++ 程序,允许用户输入两个整数,并输出它们的商和余数。

示例代码 3:用户输入与输出

#include <iostream>  
using namespace std;  

int main() {  
    int dividend, divisor;  
    cout << "请输入被除数:";  
    cin >> dividend;  
    cout << "请输入除数:";  
    cin >> divisor;  

    if (divisor == 0) {  
        cout << "错误:除数不能为零!" << endl;  
        return 1;  // 返回非零值表示程序异常终止  
    }  

    cout << "商:" << dividend / divisor << endl;  
    cout << "余数:" << dividend % divisor << endl;  

    return 0;  
}  

代码解析

  1. 输入验证:检查除数是否为零,避免运行时错误。
  2. 运算逻辑:直接使用 /% 运算符计算结果。
  3. 输出格式:清晰展示商和余数的值。

进阶应用:负数与浮点数的处理

1. 负数的特殊性

当操作数为负数时,需特别注意运算符的规则。例如:

  • -5 / 2 的结果是 -2(向零取整),而非 -3
  • -5 % 2 的结果是 -1(余数与被除数符号一致)。

示例代码 4:负数运算

#include <iostream>  
using namespace std;  

int main() {  
    int a = -5, b = 2;  
    cout << "商:" << a / b << endl;    // 输出 -2  
    cout << "余数:" << a % b << endl;  // 输出 -1  
    return 0;  
}  

2. 浮点数运算的注意事项

若操作数包含浮点数,结果将保留小数部分:

double a = 10.5, b = 3.2;  
cout << a / b << endl;  // 输出约 3.28125  

常见问题与解决方案

Q1:为什么余数不能大于除数?

根据数学定义,余数的绝对值必须小于除数的绝对值。例如,10 % 3 的余数是 1(而非 4),因为 3 × 3 = 9,余数 1 小于 3

Q2:如何避免除以零的错误?

在程序中添加条件判断,如示例代码 3 中的 if (divisor == 0),并及时终止程序或提示用户。

Q3:如何实现“向上取整”的商?

若需商向上取整(例如 -7/3 的商是 -2 而非 -3),可使用以下公式:

int quotient = (dividend + (divisor < 0 ? -1 : 1)) / divisor;  

实际案例:时间转换与分页算法

案例 1:秒转换为分钟和秒

#include <iostream>  
using namespace std;  

int main() {  
    int total_seconds = 150;  
    int minutes = total_seconds / 60;  
    int seconds = total_seconds % 60;  
    cout << total_seconds << "秒 = " << minutes << "分" << seconds << "秒" << endl;  
    // 输出:150秒 = 2分30秒  
    return 0;  
}  

案例 2:分页功能中的页码计算

假设每页显示 5 条数据,总共有 23 条记录,求总页数:

int total = 23, per_page = 5;  
int pages = (total + per_page - 1) / per_page;  // 使用向上取整逻辑  
cout << "总页数:" << pages << endl;  // 输出 5  

总结

通过本文,我们系统学习了 C++ 中求商及余数的核心知识,并通过代码实例和实际案例深化理解。从基础运算符到负数处理,再到应用到时间转换和分页算法,这些技能将成为编程道路上的坚实基础。建议读者通过动手编写代码,尝试不同的输入组合,逐步掌握运算符的特性。

掌握商和余数的计算不仅是编程的基础,更是解决复杂问题的跳板。例如,在密码学中,模运算(%)是 RSA 加密算法的核心;在游戏开发中,分页和循环逻辑也依赖于余数的特性。希望本文能为你的编程之旅提供一份清晰的地图,助你在代码世界中走得更远。

最新发布