题解:P11680 [Algo Beat Contest 001 B] Between Head and Tail

· · 题解

又来写题解了。\ 题目传送门

题目大意

如果 X 是首中尾相等数,那么 X 的数位应为奇数且 X 的首位、末位和最中间的数位上的数字相等。\ 求出 [L,R] 中所有的首中尾相等数。

题目解法

我们注意到数据范围,1 \le T \le 10,1 \le L \le R \le 10^5,也就是我们最大的数也不会超过 100000。由于数位应该是奇数,所以仅有 1\sim9100\sim99910000\sim99999 有可能是首中尾相等数。

接着,对于这三个区间,我们有:

这里我们用到一个在语法段就学过的知识。数字 X 的最后一个数位的数是 X\mod10。那么,倒数第二个数位就是 X\div10\mod10。以此类推,每向左一个数位就将除的数乘 10。第一个数位的数是 X\div10

对于每个 [L,R],我们只需要循环枚举即可。

AC code

#include <bits/stdc++.h>
using namespace std;
int main(){
    int t;
    cin>>t;
    while(t--){
        int l,r;
        cin>>l>>r;
        for(int i=l;i<=r;i++){
            if(1<=i&&i<=9){
                cout<<i<<" ";
            }else if(100<=i&&i<=999){
                if(i%10==i/10%10&&i/10%10==i/100){
                    cout<<i<<" ";
                }
            }else if(10000<=i&&i<=99999){
                if(i%10==i/100%10&&i/100%10==i/10000){
                    cout<<i<<" ";
                }
            }
        }
        cout<<endl;
      }
      return 0;
}