【USACO TRAINING】回文平方数
时间限制: 1 Sec 内存限制: 64 MB题目描述
回文数是指从左向右念和从右像做念都一样的数。如12321就是一个典型的回文数。 给定一个进制B(2<=B<=20),输出所有的大于等于1小于等于300且它的平方用B进制表示时是回文数的数。用大写字母’A’,’B’……
表示10,11等等。
输入
第1行:一个整数B,表示进制(B用十进制表示)。
输出
若干行,每行两个数字,第二个数是第一个数的平方,且第二个数是回文数。(注意:这两个数都应该表示为B进制数)
样例输入
10
样例输出
1 1
2 4
3 9
11 121
22 484
26 676
101 10201
111 12321
121 14641
202 40804
212 44944
264 69696
来源
【解】
从1开始逐步枚举到300的数,平方后转换为进制B的数,将其各数位分离进数组后判断是否回文。
输出时注意进制转换,字符要注意输出方式,将大于9的数字输出为a[i]-'A'+10。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int a[100010],b[100010];
int main(){
bool t;
int n,i,j,k,tot,op;
scanf("%d",&n);
for(i=1;i<=300;i++){
tot=0;
j=i*i;
while(j){//翻转并存入平方数
a[++tot]=j%n;
j/=n;
}
t=1;
for(k=1;k<=tot/2;k++)//判断回文数
if(a[k]!=a[tot-k+1]){
t=0;
break;
}
if(t){
j=i;
op=0;
while(j){//翻转并存入原数
b[++op]=j%n;
j/=n;
}
for(k=op;k>=1;k--)
if(b[k]>=10)printf("%c",b[k]+'A'-10);
else printf("%d",b[k]);
putchar(32);
for(k=tot;k>=1;k--)
if(a[k]>=10)printf("%c",a[k]+'A'-10);
else printf("%d",a[k]);
putchar(10);
}
}
}