/* ID:tianlin2 PROG:palsquare LANG:C++ */ #include <iostream> #include <string> #include <cmath> #include <fstream> using namespace std; //貌似output函数是多余的,可以直接fout<<b; void output(ofstream &fout,string b) { for(int i=b.size()-1;i>=0;--i) fout<<b[i]; } void ps(int n,int m,int ary,ofstream &fout) { char a[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J'}; string b,d; bool c=true; //分别把m/n放进ary进制里,存在string b/d里 while(m!=0) { b=b+a[m%ary]; m=m/ary; } while(n!=0) { d=d+a[n%ary]; n=n/ary; } //判断m是不是回文,否的话则c=false for(int x=0,y=b.size()-1;x<b.size()/2&&y>=b.size()/2;++x,--y) { if(b[x]!=b[y]) c=false; } if(c) { output(fout,d); fout<<' '; output(fout,b); fout<<endl; } } //题目意思理解错误了 /*void output(int n,int ary,ofstream &fout) { char a[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J'}; string b; while(n!=0) { b=b+a[n%ary]; n=n/ary; } for(int i=b.size()-1;i>=0;--i) fout<<b[i]; }*/ int main() { ofstream fout("palsquare.out"); ifstream fin("palsquare.in"); int ary; double n; fin>>ary; for(n=1;n!=301;++n) { int m=pow(n,2.0); ps(n,m,ary,fout); } //system("pause"); 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); } 思路和算法就不多说了 T_T