codevs 1390 回文平方数 USACO

时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 青铜 Bronze
题目描述 Description
回文数是指从左向右念和从右像做念都一样的数。如12321就是一个典型的回文数。
给定一个进制B(2<=B<=20十进制),输出所有的大于等于1小于等于300且它的平方用B进制表示时是回文数的数。用’A’,’B’……表示10,11等等。
输入描述 Input Description

共一行,一个单独的整数B(B用十进制表示)。

输出描述 Output Description

每行两个数字,第二个数是第一个数的平方,且第二个数是回文数。

样例输入 Sample Input
10
样例输出 Sample Output
1 1
2 4
3 9
11 121
22 484
26 676
101 10201
111 12321
121 14641
202 40804
212 44944
264 69696
数据范围及提示 Data Size & Hint

 一道舒心模拟题 点击传送

 

#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
using namespace std;

string a,b,c;
int B,i,j;
int pd(int k)
{
    a.clear();
    while(k)
    {
        a+=k%B;
        k/=B;
    }
    int l=0,r=a.length()-1;
    while(l<r)
    {
        if(a[l++]!=a[r--])
        return 0;
    }
    return 1;
}
void get(int q)
{
    b.clear();
    while(q)
    {
        int d=q%B;
        if(d>=10)
        b+=char(d+55);
        else b+=d;
        q/=B;
    }
}
void geta(int w)
{
    c.clear();
    while(w)
    {
        int e=w%B;
        if(e>=10)
        c+=char(e+55);
        else c+=e;
        w/=B;
    }
}
int main()
{
    scanf("%d",&B);
    for(i=1;i<=300;++i)
    {
        if(pd(i*i))
        {
            get(i);
            geta(i*i);
            for(j=b.length()-1;j>=0;--j)
            if(b[j]>='A'&&b[j]<='Z') cout<<b[j];
            else cout<<int(b[j]);
            cout<<" ";
            for(j=c.length()-1;j>=0;--j)
            if(c[j]>='A'&&c[j]<='Z') cout<<c[j];
            else cout<<int(c[j]);
            cout<<endl;
        }
    }
    return 0;
}

 

posted @ 2017-02-01 21:09  杀猪状元  阅读(208)  评论(0编辑  收藏  举报