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\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 }