1. 进制转换+回文判断+int与char之间相互转换;
以下是代码:
/* ID: dollar4 PROG: palsquare LANG: C++ */ #include <iostream> #include <fstream> #include <string> #include <algorithm> #include <cstring> using namespace std; int base; bool checkp(string str) { int len = str.size(); for (int i = 0; i < len; i++) { if (str[i] != str[len-1-i]) return false; } return true; } string trans(int a) { string str1 = ""; int tmp; while (a) { tmp = a % base; if (tmp < 10) str1 += tmp + '0'; else str1 += tmp - 10 + 'A'; a /= base; } return str1; } string change(string str) { string rlt = str; int len = str.size(); for (int i = 0; i < len; i++) rlt[i] = str[len-1-i]; return rlt; } int main() { ofstream fout ("palsquare.out"); ifstream fin ("palsquare.in"); int i; string str1, str2; fin >> base; for (i = 1; i <= 300; i++) { str1 = trans(i * i); if (checkp(str1)) { str2 = change(trans(i)); fout << str2 << " " << str1 << endl; } } return 0; }
以下是官方参考代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <ctype.h> #include <math.h> /* is string s a palindrome? */ int ispal(char *s) { char *t; t = s+strlen(s)-1; for(t=s+strlen(s)-1; s<t; s++, t--) if(*s != *t) return 0; return 1; } /* put the base b representation of n into s: 0 is represented by "" */ void numbconv(char *s, int n, int b) { int len; if(n == 0) { strcpy(s, ""); return; } /* figure out first n-1 digits */ numbconv(s, n/b, b); /* add last digit */ len = strlen(s); s[len] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[n%b]; s[len+1] = '\0'; } void main(void) { char s[20]; char t[20]; int i, base; FILE *fin, *fout; fin = fopen("palsquare.in", "r"); fout = fopen("palsquare.out", "w"); assert(fin != NULL && fout != NULL); fscanf(fin, "%d", &base); for(i=1; i <= 300; i++) { numbconv(s, i*i, base); if(ispal(s)) { numbconv(t, i, base); fprintf(fout, "%s %s\n", t, s); } } exit(0); }