1、唯一知识点:进制转换 int 位数=0; while(j不为零) { b[位数]=j mod 进制 ; j = j / 进制; 位数=位数+1; } 2、思路:穷举[1,300]所有平方数,转进制,判断是否回文数。注意原数逆序输出,回文数不需要。 /* ID: gengjia1 LANG: C TASK: palsquare */ #include <stdio.h> #include <stdlib.h> //#define NDEBUG #include <assert.h> #define N 300 int B; char num[20] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'}; char a[10] = {0}; char b[15] = {0}; int main(void) { FILE *fin = fopen ("palsquare.in", "r"); FILE *fout = fopen ("palsquare.out", "w"); int i, j, k, p; int pal; int tmp; char t; fscanf (fin, "%d", &B); assert(B >= 2); assert(B <= 20); for(i = 1; i <= N; i++) { tmp = i * i; pal = 1; j = 0; while(tmp != 0) { b[j] = num[tmp % B]; tmp = tmp / B; j += 1; } b[j] = '/0'; //判断回文 for(k = 0; k < j / 2; k++) { if(b[k] != b[j-k-1]) { pal = 0; break; } } if(pal == 1) { tmp = i; k = 0; while(tmp != 0) { a[k] = num[tmp % B]; tmp = tmp / B; k += 1; } for(p = 0; p < k/2; p++) { t = a[p]; a[p] = a[k-p-1]; a[k-p-1] = t; } a[k] = '/0'; fprintf(fout, "%s %s/n", a, b); } } fclose(fin); fclose(fout); exit(0); }