USACO 1.2.4 Palindromic Squares

//译题
//★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
",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 }
原文地址:https://www.cnblogs.com/Lee-geeker/p/3226505.html