小韦老师@NOIP 普及组-2011-数字反转
题目:
描述
给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。
输入
输入共 1 行,一个整数N。
输出
输出共 1 行,一个整数,表示反转后的新数
输入样例1
123
输出样例1
321
输入样例2
-380
输出样例2
-83
提示
-1,000,000,000≤ N ≤1,000,000,000。
题解:
思路:
整体思路:
对于一个数来说,反转之后的数字就是从右往左输出,所以可以将数字的每一位从右到左存到数组(下标为从小到大)中,如何将数组按下标从小到大输出即可。
但是这里需要注意两个问题:
1.负数。
若是负数,反转后的数也是负数,所以可以先输出一个负号,然后将该数变为相反数,便于操作。
2.反转之后的数有前导零(前面有零),所以需要跳过前导零输出。
具体步骤:
1.定义一个数组,用来存储输入的整数的每一位:
const int N = 20;
int a[N]; // 用来存储整数的每一位
2.定义一个变量 x,用来存储输入的整数,并输入 x。
3.若 x 为负数,则输出负号,将 x 变成其相反数:
if (x < 0) { // 若 x 是负数
cout << "-"; // 输出负号
x = -x; // x 变成相反数
}
4.将 x 的每一位(从右到左)都存储到数组(下标从小到大)中:
int idx = 0; // 数组的下标,初始化为 0
while (x != 0) { // 当 x 不为 0 时
a[idx++] = x % 10; // 把当前的 x 的最右边一位存在数组中
x /= 10; // x 去掉已处理过的最右边一位
}
5.去掉前导零输出:
// 用来存储第一个数组值不为 0 的数组下标,初始化为 0
int i = 0;
while (a[i] == 0) { // 当数组值为 0
i++; // i 加 1
}
for (int j = i; j < idx; j++) { // 输出合法的反转的数
cout << a[j];
}
完整代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 20;
int a[N]; // 用来存储整数的每一位
int main() {
int x; // 用来存储输入的整数
cin >> x;
if (x < 0) { // 若 x 是负数
cout << "-"; // 输出负号
x = -x; // x 变成相反数
}
int idx = 0; // 数组的下标,初始化为 0
while (x != 0) { // 当 x 不为 0 时
a[idx++] = x % 10; // 把当前的 x 的最右边一位存在数组中
x /= 10; // x 去掉已处理过的最右边一位
}
// 用来存储第一个数组值不为 0 的数组下标,初始化为 0
int i = 0;
while (a[i] == 0) { // 当数组值为 0
i++; // i 加 1
}
for (int j = i; j < idx; j++) { // 输出合法的反转的数
cout << a[j];
}
return 0;
}