♐ CSP_J 组真题
2011年
1. 数字翻转

线上OJ:

一本通:http://ybt.ssoier.cn:8088/problem_show.php?pid=1953 (opens in a new tab)
AcWing:https://www.acwing.com/problem/content/447/ (opens in a new tab)
洛谷:https://www.luogu.com.cn/problem/P1307 (opens in a new tab)

核心思想:

本题可以直接对字符串处理,也可以 直接对 int 进行处理

int的范围是 -2,147,483,648 到 2,147,483,647,正好覆盖题中的 -1,000,000,000 ≤ N≤ 1,000,000,000

字符串处理方法

1、如果是0,直接输出0
2、如果是负数,先把负号输出,然后把剩余的字符串翻转

💡

3、反转可使用 reverse(s.begin()+i, s.end()), i 表示从第 i 位到末尾进行取反
4、输出时采用 substr(i, len-i) 表示从字符串第 i 位开始输出,输出长度为 len-i

题解代码:
解法一、字符串处理
#include <bits/stdc++.h>
using namespace std;
 
string s;
int len;
 
void prt(int i) // i:从s[i]开始翻转
{
    reverse(s.begin() + i, s.end()); // 从第 i 位到末尾进行取反
 
    while(s[i] == '0')  i++;  // 跳过取反后的前导 0
 
    cout << s.substr(i, len-i); // 从第i位开始输出,输出长度为 len - i
}
 
// 字符串方法
int main()
{
    cin >> s;
    len = s.size();
    if( s == "0" )  cout << '0'; // 如果是0,直接输出0
    else
    {
        if( s[0] == '-' )  // 如果是负数
        {
            cout << '-';   // 先输出负号
            prt(1);        // ,然后从 s[1]开始翻转
        }
        else  prt(0); // 否则,就直接从 s[0]开始翻转
    }
 
    return 0;
}