题目描述
回文数是指数字从前往后读和从后往前读都相同的数字。
例如数字 1232112321 就是典型的回文数字。
现在给定你一个整数 BB,请你判断 11∼300300 之间的所有整数中,有哪些整数的平方转化为 BB 进制后,其 BB 进制表示是回文数字。
输入格式
一个整数 BB。
输出格式
每行包含两个在BB 进制下表示的数字。
第一个表示满足平方值转化为 BB 进制后是回文数字那个数,第二个数表示第一个数的平方。
所有满足条件的数字按从小到大顺序依次输出。
样例
输入数据 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
输入数据 2
12
输出数据 2
1 1
2 4
3 9
11 121
22 484
101 10201
111 12321
121 14641
12B 16661
131 16B61
202 40804
204 41414
数据范围
2≤B≤202≤B≤20
对于大于 99 的数字,用 AA表示 1010,用 BB 表示 1111,以此类推。
解题思路:首先要搞清楚题目的意思,题目是说从1到300的每个数的平方转化为对应的进制后是回文数,那么就是一个满足的条件,输出这个数在给的进制下的结果还有其平方下的该进制的结果.那么思路大体就是将平方数输入后判断该值转为给与进制后是否为回文数,如果是那么就直接将其没平方的数转为给与进制打印,在打印该进制.代码如下:
#include<iostream>
using namespace std;
int b,num;
char c[10]={'A','B','C','D','E','F','G','H','I','J'};
int ans[10000];
int fun(int m)
{
int a,cnt=1; //进制转换的余数
while(m)
{
a=m%b;
m/=b;
ans[cnt]=a;
cnt++;
//cout<<ans[cnt-1];
}
return cnt-1;
}
bool func(int k)
{
int cnt=fun(k);
if(cnt%2!=0)
{
for(int i=cnt,j=1;i>=cnt/2+1;i--)
{
if(ans[i]==ans[j]&&i!=j)
{
j++;
}
else if(ans[i]!=ans[j])
{
return false;
}
else if(i==j) return true;
}
}
else
{
for(int i=cnt,j=1;i>=cnt/2+1;i--)
{
if(ans[i]==ans[j]&&i!=j+1)
{
j++;
}
else if(ans[i]!=ans[j])
{
return false;
}
else if(i==j+1) return true;
}
}
}
int main()
{
cin>>b;
for(int i=1;i<=300;i++)
{
num=i*i;
if(func(num))
{
for(int j=fun(i);j>=1;j--)
{
if(ans[j]>9)
{
cout<<c[ans[j]%10];
}
else
cout<<ans[j];
}
cout<<" ";
for(int k=fun(num);k>=1;k--)
{
if(ans[k]>9)
{
cout<<c[ans[k]%10];
}
else cout<<ans[k];
}
cout<<endl;
}
else continue;
}
return 0;
}