[NOIP2011 普及组] 数字反转

[NOIP2011 普及组] 数字反转

GESP三级一维数组练习,个人认为是练习到目前相对比较难的一道尤其对小孩子来说,值得练习,难度★✮☆☆☆。

luogu-P1307

题目要求

题目描述

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

输入格式

一个整数 NN

输出格式

一个整数,表示反转后的新数。

样例输入 #1

123

样例输出 #1

321

样例输入 #2

-380

样例输出 #2

-83

数据范围

1,000,000,000N1,000,000,000-1,000,000,000\leq N\leq 1,000,000,000


题目分析

  1. 取数字的每一位

    • 使用取模运算(%)可以获取最后一位数字
    • 使用整除运算(/)可以去掉最后一位数字
    • 循环这个过程直到所有位数都处理完
  2. 存储和重组数字

    • 使用数组存储取出的每一位数字
    • 记录数组中数字的个数
    • 按照数据倒叙依次乘以1,10,100…然后相加重组数字
  3. 输出数字

    • 输出结果

通过这种方法,我们可以有效地处理各种情况,包括正数、负数和带前导零的数字。

{% include custom/custom-post-content-inner.html %}

示例代码

#include <iostream>
using namespace std;
int main() {
    // 定义变量a用于存储输入的整数
    int a;
    cin >> a;
    // 定义数组用于存储每一位数字
    int* array = new int[10];
    // index记录数组中数字的个数
    int index = 0;
    // tmp用于存储最终结果
    int tmp = 0;
    // 处理输入为0的特殊情况
    if (a == 0) {
        cout << 0;
        return 0;
    }
    // 循环取出每一位数字存入数组
    while (a != 0) {
        // 取出最后一位数字
        int ans = a % 10;
        array[index] = ans;
        // 去掉最后一位数字
        a /= 10;
        if (a == 0) {
            break;
        } else {
            index++;
        }
    }
    // y用于计算每一位的权重(1,10,100...)
    int y = 1;
    // 从数组末尾开始,重新组合数字
    for (int i = index; i >= 0; i--) {
        tmp += array[i] * y;
        y *= 10;
    }
    // 输出结果
    cout << tmp;
    return 0;
}

{% include custom/custom-post-content-footer.md %}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

luogu-”系列题目可在 洛谷题库 在线评测。

bcqm-”系列题目可在 编程启蒙题库 在线评测。

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
Last updated on