【题目描述】
回文数是指从左向右念和从右向左念都一样的数。如12321就是一个典型的回文数。
给定一个进制B(2<=B<=20,由十进制表示),输出所有的大于等于1小于等于300(十进制下)且它的平方用B进制表示时是回文数的数。用’A’,’B’……表示10,11等等。
【输入格式】(palsquare.in)
共一行,一个单独的整数B(B用十进制表示)。【输出格式】(palsquare.out)
每行两个B进制的符合要求的数字,第二个数是第一个数的平方,且第二个数是回文数。
【输入样例】
10
【输出样例】
1 1 2 4 3 9 11 121 22 484 26 676 101 10201 111 12321#include<cstdio> #include<cstring> using namespace std; const int maxn = 30; int b; int cou; int num[maxn]; char map[20] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J'}; int ans[20]; void init() { freopen("palsquare.in","r",stdin); freopen("palsquare.out","w",stdout); } void readdata() { scanf("%d",&b); } bool check() { bool flag = true; if(cou == 1)return flag; for(int i = 0;i <= cou/2;i++) { if(map[num[i]] != map[num[cou-i-1]]) { flag = false; break; } } return flag; } void change(int* num, int& cou, int x) { memset(num,0,sizeof(num)); cou = 0; while(x != 0) { num[cou] = x % b; x /= b; ++cou; } } void writeans(int x) { int cou1 = 0; change(ans, cou1, x); for(int i = cou1 - 1;i >= 0;i--) { printf("%c",map[ans[i]]); } printf(" "); for(int i = 0;i < cou;i++) { printf("%c",map[num[i]]); } printf("\n"); } void solve() { for(int i = 1;i <= 300;i++) { change(num, cou, i*i); if(check()) { writeans(i); } } } int main() { init(); readdata(); solve(); return 0; }