解题思路:
这道题唯一的知识点就是数制的转换。 参见 进制转换
[编辑]思路
好像没什么难的,主要就是考进制转换,以及回文数的判断。这里要注意,最大的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