题解:P1307 [NOIP2011 普及组] 数字反转

· · 题解

[NOIP2011 普及组] 数字反转 题解

题目大意

给定一个整数 N,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零。

解题思路

思路概述:

本题要求将输入的整数进行数字反转,反转后的数字必须满足整数的常见格式,即不能有前导零。

  1. 如果输入数是负数,反转后依然保留负号。
  2. 如果输入数是正数,则直接反转数字。

详细步骤:

  1. 负数判断

    • 如果输入的数字是负数,我们先记录下这个信息(flag),然后处理绝对值部分。
    • 最后,再将负号加回。
  2. 字符串处理

    • 将输入的数字转化为字符串 s,然后从字符串的最后一位开始,逐位反转数字。
  3. 反转数字

    • 通过逐位构造反转后的数,累加到 ans 中。
  4. 去除前导零

    • 由于我们是从字符串的末尾向前处理,每次遇到一个非零的数字时,会自动去除反转后的前导零。

代码实现:


#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;
}