Part I Preface
Part II Sketch
- 给定一个正整数 \(n(100\leq n \leq 999)\)。
- 求 \(n\) 是否是一个回文数,是输出 \(\texttt{Yes}\),不是输出 \(\texttt{No}\)。
Part III Analysis
Solve 1
如果仔细观察的话,应该都能发现,\(n\) 一定是一个三位数。三位数有什么特性?对,三位数是不是回文数只取决于它的百位和个位是否相等,与十位没有任何关系。所以我们可以依据这个结论判断它是否是回文数,引出了字符串和数字两种判断方式。
- 普适性:仅三位数
Solve 2
回文数判断的本质,就是把数位分离开,再让原先的最低位去现在的最高位,以此类推。我们可以用一个数整形 \(t\) 存放原数字,再用一个数 \(s\) 表示反转之后的数。每次 \(s\) 都再最高位加上 \(t\) 末尾的数字,最后判断 \(s\) 是否等于原数字即可。
- 普适性:仅 C++ 可以非高精度存放的所有数据
Solve 3
回文数判断的本质,就是把整个数反转过来,判断它和原串是否相等,只不过我们用数位分离,再乘起来的方式实现了它。STL 模板库提供了一个现成的反转函数 reverse()
,我们只需要输入字符串,reverse()
一下,判断一下是否和原字符串相等即可。
- 普适性:
string
或char[]
可以存放下的所有数据
Part IV Code
Solve 1 Code
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
int n;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
if(n / 100 == n % 10) cout << "Yes";
else cout << "No";
return 0;
}
Solve 2 Code
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int n;
int t, s;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
t = n;
while(t){
s = s * 10 + t % 10;
t /= 10;
}
if(s == n) cout << "Yes";
else cout << "No";
return 0;
}
Solve 3 Code
#include <bits/stdc++.h>
using namespace std;
string n, t;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
t = n;
reverse(t.begin(), t.end());
if(t == n) cout << "Yes";
else cout << "No";
return 0;
}