列题: 很容易就写了个代码:
#include <cstdio> #include <cstdlib> #include <cstring> char a[50], b[10]; bool check() { int t = strlen(a) / 2; for (int i = 0; i < t; ++i) { if(a[i] != a[strlen(a) - i - 1]) return false; } return true; } int main() { int B; scanf("%d", &B); printf("1 1\n"); for (int t, i = 2; i <= 300; ++i) { itoa(i * i, a, B); if(c()) { itoa(i, b, B); printf("%s %s\n", b, a); } } }但是万万没想到爆 0 了.(。•ˇ‸•。) 究其原因是 oj 系统的 cstdlib 里没有 itoa() 函数。
于是只能自己写了:
char* _itoa(int num, char* str, int radix) { // 索引,每个数字对应高进制的值 char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; unsigned unum; int i = 0, j, k; // 处理正负 // 竞赛中可能用不到,但以防万一先写上 if (radix == 10 && num < 0){ unum = (unsigned) -num; str[i++] = '-'; } else num = (unsigned)num; // 短除法 do{ str[i++] = index[unum % (unsigned)radix]; unum /= radix; } while(unum); // 结束赋值 str[i]='\0'; // 逆序,可以使用 reverse,参考 https://blog.csdn.net/weixin_42375906/article/details/108896921 if (str[0] == '-') k = 1; else k = 0; char temp; for (j = k; j <= (i - 1) / 2; ++j) { // 简简单单一个 swap(),不做解释 temp = str[j]; str[j] = str[i - 1 + k - j]; str[i - 1 + k - j] = temp; } return str; }作者:Rotch 日期:2020-10-04 修改:2020-10-04