您的位置:首页 > 其它

USACO-Section1.3 Palindromic Squares (进制转换和回文数)

2017-05-27 10:09 411 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: