现在的位置: 首页 > 综合 > 正文

USACO 1.2.4 Palindromic Squares (palsquare)

2018年04月29日 ⁄ 综合 ⁄ 共 1162字 ⁄ 字号 评论关闭

解题思路:

这道题唯一的知识点就是数制的转换。 参见 进制转换

[编辑]思路

好像没什么难的,主要就是考进制转换,以及回文数的判断。这里要注意,最大的20进制中20表示为J,不要只CASE到15哦!
穷举1——300的所有平方数,转进制,比较,OK了~除非你不会怎么转进制。短除,然后逆序输出。

[编辑]参考伪代码

C/C++

      int 位数=0;
      while(j != 0)
        {
          b[位数]=j % 进制 ;
          j = j / 进制;
         位数=位数+1;
        }

代码:

# include<cstdio>
# include<iostream>

using namespace std;

char c[20]={ '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J' };

int B;
int x[20];
int y[20];
int l,L;


void change( int n )
    {
        int m;
        m = n;
        l = 0;
        while ( m > 0 )
            {
                x[++l] = m%B;
                m = m/B;
            }
        m = n*n;
        L = 0;
        while ( m > 0 )
            {
                y[++L] = m%B;
                m = m/B;
            }
    }

int pd ( )
    {
        int i,j;
        for ( i = 1,j = L;i <= j;i++,j-- )
            {
                if ( y[i]!=y[j] )
                    return 0;
            }
        return 1;
    }


int main(void)
{
    freopen("palsquare.in","r",stdin);
    freopen("palsquare.out","w",stdout);
    int i,j;
    cin>>B;
    for ( i = 1;i <= 300;i++ )
        {
            change(i);
            if ( pd() )
                {
                    for ( j = l;j >= 1;j-- )cout<<c[x[j]];
                        cout<<" ";
                        for ( j = L;j >= 1;j-- )cout<<c[y[j]];
                            cout<<endl;
                }
        }


    return 0;
}

描述

回文数是指从左向右念和从右向左念都一样的数。如12321就是一个典型的回文数。

给定一个进制B(2<=B<=20,由十进制表示),输出所有的大于等于1小于等于300(十进制下)且它的平方用B进制表示时是回文数的数。用’A’,’B’……表示10,11等等。

[编辑]格式

PROGRAM NAME: palsquare

INPUT FORMAT:

file (palsquare.in)

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

OUTPUT FORMAT:

file (palsquare.out)

每行两个B进制的符合要求的数字,第二个数是第一个数的平方,且第二个数是回文数.

[编辑]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

抱歉!评论已关闭.