样例
输入数据 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
12
输出数据 2
1 1
2 4
3 9
11 121
22 484
101 10201
111 12321
121 14641
12B 16661
131 16B61
202 40804
204 41414
数据范围
2≤ B ≤ 20
对于大于 9 的数字,用 A表示 10,用 B 表示 11,以此类推。
分析:
1、这个题需要考虑两点:一是进制之间的转换,二是判断数的平方是否为回文数(即数字成对称状)
2、进制转换:十进制转化成其他进制:短除法
其他进制转化成十进制:秦九韶算法
其他进制转化成其他进制:十进制过渡+ 短除法
3、思路:暴力枚举
枚举从1到300,首先将 n 转化为对应进制,其次再每次检查在b进制中是否回文数
4、思路:打表
因为1~300也不是不能一个个算出来的,所以本题还可打表,但是打表就失去了这个题的意义,还是要学会进制转换以及回文数的判断的,但凡数据大点,亦或是随机输入一个范围,就难了。
完整代码如下:
暴力枚举:不会写,借鉴的是题解 (T_T)
#include<bits/stdc++.h>
using namespace std;
char get(int x){ // 将数字转为字符
if (x <= 9)
return x + '0';
return x - 10 + 'A';
}
string base(int n, int b){ //将n转换为 b进制,返回对应字符串(短除法)
string res;
while (n){
res += get(n % b);
n /= b;
}
reverse(res.begin(), res.end());//反转
return res;
}
bool check(string s){ // 判断是否为回文数 :双指针算法
for (int i = 0, j = s.size() - 1; i < j; i ++, j -- )
if (s[i] != s[j])
return false;
return true;
}
int main(){
int b;
cin >> b;
for (int i = 1; i <= 300; i ++ ){ // 暴力
string num = base(i * i, b); // 检查是否为回文数
if (check(num))
cout << base(i, b) << ' ' << num << endl;
}
return 0;
}
打表:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
if(n==2)printf(
"1 1\n"
"11 1001"
);
if(n==3)printf(
"1 1\n"
"2 11\n"
"11 121\n"
"101 10201\n"
"102 11111\n"
"202 112211\n"
"211 122221\n"
"1001 1002001\n"
"1021 1120211\n"
"2002 11022011\n"
"10001 100020001\n"
"10022 101212101\n"
"11012 122111221\n"
"12201 1012112101\n"
"20002 1100220011\n"
"100001 10000200001\n"
"100201 10111011101\n"
);
if(n==4)printf(
"1 1\n"
"11 121\n"
"101 10201\n"
"111 12321\n"
"1001 1002001\n"
"1013 1032301\n"
"1103 1223221\n"
"10001 100020001\n"
"10101 102030201\n"
"10121 103101301\n"
);
if(n==5)printf(
"1 1\n"
"2 4\n"
"11 121\n"
"101 10201\n"
"111 12321\n"
"231 114411\n"
"1001 1002001\n"
"1111 1234321\n"
);
if(n==6)printf(
"1 1\n"
"2 4\n"
"11 121\n"
"101 10201\n"
"111 12321\n"
"204 42424\n"
"231 102201\n"
"1001 1002001\n"
"1111 1234321\n"
);
if(n==7)printf(
"1 1\n"
"2 4\n"
"4 22\n"
"11 121\n"
"13 202\n"
"14 232\n"
"26 1111\n"
"44 2662\n"
"55 4444\n"
"101 10201\n"
"111 12321\n"
"121 14641\n"
"143 24442\n"
"316 134431\n"
"404 224422\n"
);
if(n==8)printf(
"1 1\n"
"2 4\n"
"3 11\n"
"6 44\n"
"11 121\n"
"13 171\n"
"33 1331\n"
"101 10201\n"
"111 12321\n"
"117 14141\n"
"121 14641\n"
"123 15351\n"
"303 112211\n"
"333 135531\n"
"355 155551\n"
);
if(n==9)printf(
"1 1\n"
"2 4\n"
"11 121\n"
"22 484\n"
"101 10201\n"
"111 12321\n"
"121 14641\n"
"202 40804\n"
);
if(n==10)printf(
"1 1\n"
"2 4\n"
"3 9\n"
"11 121\n"
"22 484\n"
"26 676\n"
"101 10201\n"
"111 12321\n"
"121 14641\n"
"202 40804\n"
"212 44944\n"
"264 69696\n"
);
if(n==11)printf(
"1 1\n"
"2 4\n"
"3 9\n"
"6 33\n"
"11 121\n"
"22 484\n"
"24 565\n"
"66 3993\n"
"77 5335\n"
"101 10201\n"
"111 12321\n"
"121 14641\n"
"202 40804\n"
"212 44944\n"
"234 53535\n"
);
if(n==12)printf(
"1 1\n"
"2 4\n"
"3 9\n"
"11 121\n"
"22 484\n"
"101 10201\n"
"111 12321\n"
"121 14641\n"
"12B 16661\n"
"131 16B61\n"
"202 40804\n"
"204 41414\n"
);
if(n==13)printf(
"1 1\n"
"2 4\n"
"3 9\n"
"11 121\n"
"22 484\n"
"101 10201\n"
"111 12321\n"
"121 14641\n"
"131 16B61\n"
);
if(n==14)printf(
"1 1\n"
"2 4\n"
"3 9\n"
"11 121\n"
"1A 2D2\n"
"22 484\n"
"35 B3B\n"
"BB 9CC9\n"
"101 10201\n"
"111 12321\n"
"121 14641\n"
"131 16B61\n"
);
if(n==15)printf(
"1 1\n"
"2 4\n"
"3 9\n"
"4 11\n"
"8 44\n"
"C 99\n"
"11 121\n"
"14 191\n"
"22 484\n"
"29 6B6\n"
"44 1331\n"
"51 1AA1\n"
"88 4CC4\n"
"99 6226\n"
"101 10201\n"
"111 12321\n"
"121 14641\n"
"131 16B61\n"
);
if(n==16)printf(
"1 1\n"
"2 4\n"
"3 9\n"
"11 121\n"
"22 484\n"
"101 10201\n"
"111 12321\n"
"121 14641\n"
);
if(n==17)printf(
"1 1\n"
"2 4\n"
"3 9\n"
"4 G\n"
"6 22\n"
"C 88\n"
"11 121\n"
"1B 2C2\n"
"22 484\n"
"4G 1771\n"
"66 2662\n"
"101 10201\n"
);
if(n==18)printf(
"1 1\n"
"2 4\n"
"3 9\n"
"4 G\n"
"11 121\n"
"22 484\n"
"2D 777\n"
"3B D0D\n"
);
if(n==19)printf(
"1 1\n"
"2 4\n"
"3 9\n"
"4 G\n"
"A 55\n"
"11 121\n"
"22 484\n"
"33 9I9\n"
"37 B6B\n"
"AA 5FF5\n"
"BB 7117\n"
"D3 9229\n"
);
if(n==20)printf(
"1 1\n"
"2 4\n"
"3 9\n"
"4 G\n"
"11 121\n"
"22 484\n"
"25 515\n"
"33 9I9\n"
"DD 9669\n"
);
return 0;
}