[USACO1.2]回文平方数 Palindromic Squares

发布时间 2023-05-24 19:31:10作者: o-Sakurajimamai-o

# [USACO1.2]回文平方数 Palindromic Squares

## 题目描述

回文数是指从左向右念和从右向左念都一样的数。如 12321 就是一个典型的回文数。

给定一个用十进制表示的正整数 B,输出所有 [1,300] 中,它的平方用 B 进制表示时是回文数的数。

## 输入格式

共一行,一个单独的正整数 B。

## 输出格式

每行两个 B 进制的符合要求的数字,第二个数是第一个数的平方,且第二个数是回文数。

注意大于 9 的数,用字母表示。如用 `A` 表示 10,`B` 表示 11,用第 n 个大写字母表示 n+9。

## 样例 #1

### 样例输入 #1

```
10
```

### 样例输出 #1

```
1 1
2 4
3 9
11 121
22 484
26 676
101 10201
111 12321
121 14641
202 40804
212 44944
264 69696
```

很明显啊,回文数不是什么新鲜事,关键在于数制转换;

#include<bits/stdc++.h>
using namespace std;
int n,a[10001],b[10001],ss,s;
int main()
{
    cin>>n;
    for(int i=1;i<301;i++)
    {
        int op=i*i;
        ss=1,s=1;
        a[1]=op,b[1]=i;
        while(b[s]>=n)//新学的技巧,转换进制
        {
            b[s+1]+=b[s]/n;
            b[s]%=n;
            s++;
        }
        while(a[ss]>=n)
        {
            a[ss+1]+=a[ss]/n;
            a[ss]%=n;
            ss++;
        }
        for(int j=1;j<=ss/2;j++)
            if(a[j]!=a[ss-j+1]) goto nexts;//第一次用go to函数,好帅;
        for(int j=s;j>=1;j--)
            if(b[j]<10) cout<<b[j];
            else cout<<char(55+b[j]);
        cout<<" ";
        for(int j=1;j<=ss;j++)
            if(a[j]<10) cout<<a[j];
            else cout<<char(55+a[j]);
        cout<<endl;
        nexts:;
        memset(a,0,sizeof a);
        memset(b,0,sizeof b);
    }
    return 0;
}