【USACO 1.2.4】回文平方数
【题目描述】
回文数是指从左向右念和从右向左念都一样的数。如12321就是一个典型的回文数。
给定一个进制B(2<=B<=20,由十进制表示),输出所有的大于等于1小于等于300(十进制下)且它的平方用B进制表示时是回文数的数。用’A’,’B’……表示10,11等等。
【格式】
INPUT FORMAT:
file (palsquare.in)
共一行,一个单独的整数B(B用十进制表示)。
OUTPUT FORMAT:
file (palsquare.out)
每行两个B进制的符合要求的数字,第二个数是第一个数的平方,且第二个数是回文数。
【分析】
枚举+进制转换。
1 #include <cstdlib> 2 #include <iostream> 3 #include <cstdio> 4 #include <cmath> 5 #include <cstring> 6 const int maxl=1000; 7 using namespace std; 8 int shu_1[maxl],shu_2[maxl]; 9 int temp[maxl]; 10 //进制转换 11 void change(int *shu,int num,int system); 12 void print(int *shu); 13 bool check(int *shu);//检查是否是回文数 14 int main() 15 { 16 int n,i; 17 18 //文件操作 19 freopen("palsquare.in","r",stdin); 20 freopen("palsquare.out","w",stdout); 21 scanf("%d",&n); 22 23 for (i=1;i<=300;i++) 24 { 25 change(shu_1,i,n); 26 change(shu_2,i*i,n); 27 if (check(shu_2)) 28 { 29 print(shu_1);printf(" "); 30 print(shu_2);printf("\n"); 31 } 32 } 33 return 0; 34 } 35 //把一个num转换成system进制的数 36 void change(int *shu,int num,int system) 37 { 38 int point=0; 39 memset(shu,0,sizeof(shu)); 40 memset(temp,0,sizeof(temp)); 41 point++; 42 //进制转换 43 while (num!=0) 44 { 45 int t; 46 t=num%system; 47 num=num/system; 48 temp[point++]=t; 49 } 50 point--; 51 for (int i=point;i>=1;i--) shu[point-i+1]=temp[i]; 52 shu[0]=point;//长度 53 return; 54 } 55 bool check(int *shu) 56 { 57 int point=shu[0],i; 58 for (i=1;i<=(point/2)+1;i++) 59 if (shu[i]!=shu[point-i+1]) return 0; 60 return 1; 61 } 62 void print(int *shu) 63 { 64 for (int i=1;i<=shu[0];i++) 65 { 66 if (shu[i]>=10) printf("%c",char(shu[i]-10+'A')); 67 else printf("%d",shu[i]); 68 } 69 }