//译题
//★Palindromic Squares 回文平方数
回文数是指从左向右念和从右像做念都一样的数.如12321 就是一个典型的回文数.
给定一个进制B(2<=B<=20 十进制),输出所有的大于等于1 小于等于300 且它的平方用B 进制表示
时是回文数的数.用’A’,’B’……表示10,11 等等.
PROGRAM NAME: palsquare
INPUT FORMAT
共一行,一个单独的整数B(B 用十进制表示).
SAMPLE INPUT (file palsquare.in)
10
OUTPUT FORMAT
每行两个数字,第二个数是第一个数的平方,且第二个数是回文数.(注意:这两个数都应该在B 那个
进制下)
SAMPLE OUTPUT (file palsquare.out)
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 /*
2 这道题注意两个个地方,一个是如何将十进制数转换为其他进制的数 (2—20)
3 另一个是如何判断是否是回文数 ;
4 按照题目的意思,从1扫到300,找出符号条件的数,转化为给定的进制输出即可。
5 */
6 #include<stdio.h>
7 int B, l, L;
8 int x[20],y[20];
9 char tmp1[20], tmp2[20];
10 char temp[21]={'0','1','2','3','4','5','6','7','8','9',
11 'A','B','C','D','E','F','G','H','I','J'};
12 void Change(int n) //用于进制转换
13 {
14 int m = n;
15 l = -1;
16 while(m) {x[++l] = m%B; m /= B;}
17 m = n*n, L = -1;
18 while(m) {y[++L] = m%B; m /= B;}
19 }
20
21 int OK() //判断是否是回文数
22 {
23 int i,j;
24 for(i=0, j=L; i<=j; i++, j--)
25 if(y[i] != y[j]) return 0;
26 return 1;
27 }
28
29 void output(int n) //用于输出
30 {
31 int i,j;
32 for(i=l,j=0;i>=0;j++,i--)
33 tmp1[j] = temp[x[i]]; //通过temp把tmp1转化成正序(原来在x里存放时是倒序的,而且超过10的数还是用数字表示,这个用temp可以进行转换)
34 for(i=L,j=0;i>=0;j++,i--)
35 tmp2[j] = temp[y[i]]; //同上
36 printf("%s %s\n",tmp1,tmp2); //打印
37 }
38
39 int main()
40 {
41 freopen("palsquare.in","r",stdin);
42 freopen("palsquare.out","w",stdout);
43 int i;
44 scanf("%d",&B);
45 for(i=1;i<=300;i++) //依照题意 扫1到300
46 {
47 Change(i);
48 if(OK()) output(i);
49 }
50 return 0;
51 }