回文数是指从左向右念和从右像做念都一样的数.如 12321 就是一个典型的回文数. 给定一个进制 B(2<=B<=20 十进制),输出所有的大于等于1,小于等于 300 且它的平方用 B 进制表示时是回文数的数.用’A’,’B’……表示 10,11 等等.
输入格式:
共一行,一个单独的整数 B(B 用十进制表示).
输出格式:
每行两个数字,第二个数是第一个数的平方,且第二个数是回文数.(注意:这两个数都应该在 B 那个进制下)
输入样例1:
在这里给出一组输入。例如:
10
输出样例1:
在这里给出相应的输出。例如:
1 1
2 4
3 9
11 121
22 484
26 676
101 10201
111 12321
121 14641
202 40804
212 44944
264 69696
输入样例2:
5
输出样例2:
1 1
2 4
11 121
101 10201
111 12321
231 114411
1001 1002001
1111 1234321
输入样例3:
15
输出样例3:
1 1
2 4
3 9
4 11
8 44
C 99
11 121
14 191
22 484
29 6B6
44 1331
51 1AA1
88 4CC4
99 6226
101 10201
111 12321
121 14641
131 16B61
【源代码】
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
bool Palin_num(const string a) // 回文数判断函数,使用字符串判断法:回文数关于中心对称,只要比较对称的数即可;
{
int length;
length = a.length();
int flag = 1;
for (int i = 0; i <= (length / 2); i++)
{
if (a[i] != a[length - i - 1])
{
flag = 0;
break;
}
}
if (flag == 1) // 是回文数;
{
return true;
}
else
{
return false;
}
}
string intToA(int n, int radix) //进制转换函数,使用模N取余法;
{
string ans = "";
do {
int t = n % radix;
if (t >= 0 && t <= 9)
{
ans += t + '0';
}
else
{
ans += t - 10 + 'A'; // 保证进制大于10时,数字能用大写字母表示;
}
n /= radix;
} while (n != 0); // 使用do{}while(),以防止输入为0的情况;
reverse(ans.begin(), ans.end()); // 模N取余法,得到的字符串反转即可得到对应进制的数;
return ans;
}
int main()
{
int n;
cin >> n;
int j = 0;
for (int x = 1; x <= 300; x++)
{
j = x; // 创建副本
string s1 = intToA(j, n); // 将整数按n进制转换;
string s2 = intToA((j * j), n);// 将该数的平方按n进制转换;
if (Palin_num(s2))
{
cout << s1 << " " << s2 << endl;
}
else
{
continue;
}
}
return 0;
}