解题思路:
这道题唯一的知识点就是数制的转换。 参见 进制转换
[编辑]思路
好像没什么难的,主要就是考进制转换,以及回文数的判断。这里要注意,最大的20进制中20表示为J,不要只CASE到15哦!
穷举1——300的所有平方数,转进制,比较,OK了~除非你不会怎么转进制。短除,然后逆序输出。
[编辑]参考伪代码
C/C++
int 位数=0; while(j != 0) { b[位数]=j % 进制 ; j = j / 进制; 位数=位数+1; }
代码:
# include<cstdio>
# include<iostream>
using namespace std;
char c[20]={ '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J' };
int B;
int x[20];
int y[20];
int l,L;
void change( int n )
{
int m;
m = n;
l = 0;
while ( m > 0 )
{
x[++l] = m%B;
m = m/B;
}
m = n*n;
L = 0;
while ( m > 0 )
{
y[++L] = m%B;
m = m/B;
}
}
int pd ( )
{
int i,j;
for ( i = 1,j = L;i <= j;i++,j-- )
{
if ( y[i]!=y[j] )
return 0;
}
return 1;
}
int main(void)
{
freopen("palsquare.in","r",stdin);
freopen("palsquare.out","w",stdout);
int i,j;
cin>>B;
for ( i = 1;i <= 300;i++ )
{
change(i);
if ( pd() )
{
for ( j = l;j >= 1;j-- )cout<<c[x[j]];
cout<<" ";
for ( j = L;j >= 1;j-- )cout<<c[y[j]];
cout<<endl;
}
}
return 0;
}
描述
回文数是指从左向右念和从右向左念都一样的数。如12321就是一个典型的回文数。
给定一个进制B(2<=B<=20,由十进制表示),输出所有的大于等于1小于等于300(十进制下)且它的平方用B进制表示时是回文数的数。用’A’,’B’……表示10,11等等。
[编辑]格式
PROGRAM NAME: palsquare
INPUT FORMAT:
file (palsquare.in)
共一行,一个单独的整数B(B用十进制表示)。
OUTPUT FORMAT:
file (palsquare.out)
每行两个B进制的符合要求的数字,第二个数是第一个数的平方,且第二个数是回文数.
[编辑]SAMPLE INPUT
10
[编辑]SAMPLE OUTPUT
1 1 2 4 3 9 11 121 22 484 26 676 101 10201 111 12321 121 14641 202 40804 212 44944 264 69696