2017-5-27
题目描述
十进制数1到300的平方用N进制表示,若为回文数,则输出
解答
大体就是进制转换以及判断回文数的结合
代码
/*
ID: 18795871
PROG: palsquare
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
ifstream fin("palsquare.in");
ofstream fout("palsquare.out");
const int N = 17;
char x[21]="0123456789ABCDEFGHIJ";
int n;
char c[N+1];
void cal(int a){//将十进制a用n进制表示
char d[N+1];
int i=0;
while (a){
d[i++]=x[a%n];
a/=n;
}
for (int j=0;j<i;j++) c[j]=d[i-j-1];
c[i]='\0';
}
bool res(char *a){
char b[N+1];
int l=strlen(a);
for (int i=0;i<l;i++) b[l-i-1]=a[i];
b[l]='\0';a[l]='\0';
if (strcmp(a,b)==0) return true;
return false;
}
int main()
{
fin>>n;
for (int i=1;i<=300;i++){
cal(i*i);
if (res(c)){
cal(i);
fout<<c<<" ";
cal(i*i);
fout<<c<<endl;
}
}
return 0;
}
说一下需要注意的地方:
(1)注意对十进制以上字符的判断,A代表10,B代表11,以此类推。
(2)注意输出的是B进制的两个数,原数和它的平方。
/*
ID: 18795871
PROG: palsquare
LANG: C++
*/
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("palsquare.in");
ofstream fout("palsquare.out");
int n;
bool isPal(char p[100],int l){
if (l==1) return true;
for (int i=0;i<l/2;i++){
if (p[i]!=p[l-i-1]) return false;
}
return true;
}
bool cal(int p){
char c1[100],c2[100];
int k1=p,k2=p*p,cnt1=0,cnt2=0;
while (k1){
if (k1%n<10) c1[cnt1]=k1%n+'0';
else c1[cnt1]=(k1%n-10)+'A';
k1=k1/n;
cnt1++;
}
while (k2){
if (k2%n<10) c2[cnt2]=k2%n+'0';
else c2[cnt2]=(k2%n-10)+'A';
k2=k2/n;
cnt2++;
}
if (!isPal(c2,cnt2)) return false;
for (int i=cnt1-1;i>=0;i--) fout<<c1[i];
fout<<" ";
for (int i=cnt2-1;i>=0;i--) fout<<c2[i];
fout<<endl;
return true;
}
int main(){
while (fin>>n){
for (int i=1;i<=300;i++){
if (!cal(i)) continue;
}
}
return 0;
}