题解:P1307 [NOIP2011 普及组] 数字反转
Wallacewwz · · 题解
[NOIP2011 普及组] 数字反转 题解
题目大意
给定一个整数
解题思路
思路概述:
本题要求将输入的整数进行数字反转,反转后的数字必须满足整数的常见格式,即不能有前导零。
- 如果输入数是负数,反转后依然保留负号。
- 如果输入数是正数,则直接反转数字。
详细步骤:
-
负数判断:
- 如果输入的数字是负数,我们先记录下这个信息(
flag),然后处理绝对值部分。 - 最后,再将负号加回。
- 如果输入的数字是负数,我们先记录下这个信息(
-
字符串处理:
- 将输入的数字转化为字符串
s,然后从字符串的最后一位开始,逐位反转数字。
- 将输入的数字转化为字符串
-
反转数字:
- 通过逐位构造反转后的数,累加到
ans中。
- 通过逐位构造反转后的数,累加到
-
去除前导零:
- 由于我们是从字符串的末尾向前处理,每次遇到一个非零的数字时,会自动去除反转后的前导零。
代码实现:
#include <bits/stdc++.h>
using namespace std;
string s; // 输入的数字字符串
long long ans = 0; // 存储反转后的数字
int flag = 0; // 标记负数
int main() {
cin >> s; // 读取输入
int k = s.length() - 1; // 计算字符串的最后一个字符下标
// 如果是负数,处理负号并标记
if (s[0] == '-') {
flag = 1;
cout << '-'; // 输出负号
}
// 从字符串的最后一位开始,逐位构造反转后的数字
for (int i = k; i >= flag; i--) {
ans *= 10; // 每次将当前结果乘以10,腾出个位
ans += (s[i] - '0'); // 加上当前位的数字
}
cout << ans << '\n'; // 输出反转后的数字
return 0;
}