C++ 算法竞赛 题目解析:Integer Division Returns 整数除法返回值
1. 题目: Integer Division Returns 整数除法返回值
性能限制
内存: 128 MB,时间: 1 S
题目信息

输入输出实例
输入样例127
输出样例13
输入样例2-13
输出样例2-1
输入样例340
输出样例34
输入样例4-20
输出样例4-2
输入样例5123456789123456789
输出样例512345678912345679
数据范围与提示

2. 代码
#include <iostream>
using namespace std;
using ll = long long;
int main() {
ll X; cin >> X;
// 已知X一定是整数
if (X >= 0) {
// 正数向上取整
cout << (X + 9) / 10;
} else {
// 负数时整数除法已是向上取整(向零取整)
cout << X / 10;
}
}
更简洁的写法
#include <iostream>
using namespace std;
using ll = long long;
int main() {
ll X; cin >> X;
cout << (X >= 0 ? (X + 9) / 10 : X / 10);
}
3. 解析
3.1 using ll = long long;
从题目信息中可知 X 一定是整数,且 |X| ≤ 10^18,超出 32 位 int 范围,因此使用
long long。
在 C++11 中,using 被官方推荐用来给类型起别名(取代 C++98 的 typedef)。
不要再用 #define 来定义类型别名了,那是 C语言 风格的宏替换,不具类型安全。
(注:#define 在 C++ 中仍可用于头文件保护、条件编译等场景,只是不推荐用于类型别名。)
例如 #define A a?ahahello@+b 并不会报错,它只是预处理阶段进行文本替换。
用 #define 定义类型别名会养成不好的习惯,在真正的 C++ 工程中不推荐使用。
using的具体用法大家可以咨询AI
3.2 算法逻辑
已知 X 一定是整数
如果 X >= 0 ,那么 X / 10 的效果相当于直接丢弃个位
例如120~129这10个数字 / 10 结果都是一样的
在C++中不同类型的数据是无法直接进行运算 (operate) 的,如果一个运算符两边存在不同类型的数据,那么必须将两种数据转换成相同类型的数据才能运算 (有的类型系统会自动完成转换)
operate不只有运算的意思,还有操作的意思,理解英文原本的意思很重要
也就是说在C++中运算符 (operator),除了数学意义上的运算外,还能做很多其它操作
由于 X 是整数类型,10 也是整数类型,两个整数类型的运算结果一定是整数类型(具体类型由操作数类型决定)
整数类型包括:int,long,long long,unsigned等等
两个整数类型的数据进行 / 运算时,执行的是整数除法,结果直接截断小数部分(向零取整),得到整数类型的整数商。
比如12 / 10 = 1.2 (在数学上), 12 / 10 的结果是 1。
那么利用这个特点我们就可以得到一个很有意思的算法:
当X为一个正整数或0时(X+9) / 10的结果一定等于 X ÷ 10 向上取整的结果
例如 123 ÷ 10 = 12.3,12.3向上取整的结果为13
而 123 / 10 这个表达式的值为 12(123 + 9) / 10 这个表达式的值为 13,也就是 132 / 10
只要X的个位上的数字>=1,那么当它+9时就一定会往十位进1
大家可以带入更多的数字,自己理解一下
当X为一个负整数时X / 10 的结果一定等于 X ÷ 10 向上取整 (向零取整) 的结果
由于负数的特殊性质,一个负整数÷10后向上取整,等于直接舍去小数部分
这和C++里 整数 类型的除法规律刚好相同,因此我们可以利用这一特点
对于负数,向零取整与向上取整结果一致,而 C++ 的整数除法正是向零取整,所以可以直接用 X/10
例如:
-123 ÷ 10 = -12.3,-12.3向上取整的结果为-12-127 ÷ 10 = -12.7,-12.7向上取整的结果为-12-120 ÷ 10 = -12.0,-12.0向上取整的结果为-12
这两种情况刚好是对立面,所以我们可以用 if-else 语句
而 C/C++ 最具特色的就是条件表达式 (问号表达式)condition ? expression1 : expression2
如果 condition 处的值等于或能被转化为true,那么整个表达式的值为expression1的值
如果 condition 处的值等于或能被转化为false,那么整个表达式的值为expression2的值
极简代码:
cout << (X >= 0 ? (X + 9) / 10 : X / 10);
3.3 省略 return 0;
在算法竞赛中,同学们需要争分夺秒,时间特别宝贵
C++ 标准规定:当 main 函数执行到末尾而没有 return 语句时,效果等同于 return 0;。
因此可以省略不写,不影响正确性。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)