文章

【GESP】C++三级练习 luogu-P1307, [NOIP2011 普及组] 数字反转

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

luogu-P1307

题目要求

题目描述

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

输入格式

一个整数 $N$。

输出格式

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

样例输入 #1

1
123

样例输出 #1

1
321

样例输入 #2

1
-380

样例输出 #2

1
-83

数据范围

$-1,000,000,000\leq N\leq 1,000,000,000$。


题目分析

  1. 取数字的每一位
    • 使用取模运算(%)可以获取最后一位数字
    • 使用整除运算(/)可以去掉最后一位数字
    • 循环这个过程直到所有位数都处理完
  2. 存储和重组数字
    • 使用数组存储取出的每一位数字
    • 记录数组中数字的个数
    • 按照数据倒叙依次乘以1,10,100…然后相加重组数字
  3. 输出数字
    • 输出结果

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

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#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;
}

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

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

本文由作者按照 CC BY 4.0 进行授权