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

2017-5-27

题目描述

十进制数1300的平方用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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值