题解 B2028 【反向输出一个三位数】

· · 题解

题解

解法 1

虽然说题目上是要反向输出一个三位数,但是这个反向后的三位数并没有要求去掉前导 0 。因此本质上就是字符串翻转。

而进行字符串翻转,也有两种做法:一种是比较常规的使用 \verb!for! 循环进行翻转,另外一种做法就是利用字符串本身所具有的函数进行翻转。

使用 \verb!for! 循环的主要代码片段如下:

for(int i=0;i<s.length()/2;++i) swap(s[i],s[s.length()-i-1]);

然后, C++ 里提供了 \verb!reverse()! 函数用于翻转一个容器(比如数组、字符串什么的)。具体用法,就是传入这个容器的头指针和尾的下一个位置的指针(因为 C++ 是左闭右开的),然后就会翻转。代码的主要片段如下:

reverse(s.begin(),s.end());

还有一种做法,就是利用的性质,先进后出。使用 \verb!stack! 类型,定义一个栈;当输入所有字符后,从栈顶开始输出。栈有以下三种操作:

以外,因为这题都是三位数,所以直接 \verb!swap! 第一位和第三位就行了。

代码 1

#include<bits/stdc++.h>
#define up(l,r,i) for(int i=l,END##i=r;i<=END##i;++i)
#define dn(r,l,i) for(int i=r,END##i=l;i>=END##i;--i)
using namespace std;
typedef long long i64;
const int INF =2147483647;
stack <char> s; char c;
int main(){
    while(isdigit(c=getchar())) s.push(c);
    while(!s.empty()) putchar(s.top()),s.pop();
    return 0;
}

解法 2

给点面子,人家毕竟是数字嘛。

但是这题翻转前后可能并不是常规意义的数字(可能会含有前导零什么的)。其实这一点并不会影响答案的正确性。我们输入数字后,每次除以 10 ,得到的余数就是当前的最后一位;重复做 3 次,即使过程中这个数字变成了 0 ,那也照样可以输出 0

代码 2

#include<bits/stdc++.h>
#define up(l,r,i) for(int i=l,END##i=r;i<=END##i;++i)
#define dn(r,l,i) for(int i=r,END##i=l;i>=END##i;--i)
using namespace std;
typedef long long i64;
const int INF =2147483647; int w;
int main(){
    up(0,2,i) w=w*10+(getchar()-'0');
    up(0,2,i) putchar('0'+w%10),w/=10;
    return 0;
}