[AtCoder-AT_ABC070_A]题解(C++)

发布时间 2023-05-09 13:53:55作者: -沉默-

Part I Preface

原题目(Luogu)
原题目(AtCoder)

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() 一下,判断一下是否和原字符串相等即可。

  • 普适性:stringchar[] 可以存放下的所有数据

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;
}

Part V Record


Record