YOUR PROGRAM ('palsquare') WORKED FIRST TIME! That's fantastic -- and a rare thing. Please accept these special automated congratulations.
太COOL了,一次AC,虽然题简单,但还是好高兴。。。
此题主要就是考十进制转N进制,草纸上划划就出来了!
/* ID: LANG: C TASK: palsquare */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define SZ 20 #define N 300 char *num = "0123456789ABCDEFGHIJK";//2-20进制的所有字符 void convert(int base, int n, char *p) { int i, k; i = 0; while(n > 0) { k = 0; while(n >= base) { n -= base; k++; } p[i++] = num[n]; n = k; } p[i++] = '/0'; } int isPalindromic(char *p) { int i, j, len; len = strlen(p); for(i = 0, j = len - 1; i < j; i++, j--) if(p[i] != p[j]) return 0; return 1; } void reverse(char *p) { char c; int i, j, len; len = strlen(p); for(i = 0, j = len - 1; i < j; i++, j--) { c = p[i]; p[i] = p[j]; p[j] = c; } } int main() { FILE *fin = fopen("palsquare.in", "r"); FILE *fout = fopen("palsquare.out", "w"); char org[SZ], pal[SZ]; int i, base; fscanf(fin, "%d", &base); for(i = 1; i <= N; i++) { convert(base, i, org);//把十进制的i转换成base进制的字符串 convert(base, i * i, pal); if(isPalindromic(pal)) {//判断i的平方是不是回文数 reverse(org);//反转i的字符串,因为存储的时候是逆序存储的 fprintf(fout, "%s %s/n", org, pal); } } exit(0); }
分析的解法在求数的字符串表示时用了递归,这样存储时就是顺序存储的了,还有当i平方不是回文数的时候我也进行了i的转换,应该把i的转换写在里面,stupid:(
分析里有个写法s[len] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[n%b];就是求字符串对应下标的字符,然后进行赋值,以前没遇到这种写法,比较有意思。。。