`
925695531
  • 浏览: 22364 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

usaco Palindromic Squares 解题报告

阅读更多
题意:

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

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

题解:数制转换一下

代码:

/*
ID:     lishicao
PROG:   palsquare
LANG:   C++
*/
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std ;

ifstream fin  ( "palsquare.in"  ) ;
ofstream fout ( "palsquare.out" ) ;

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

bool check()
{
    for( int i = 0 ; i < strlen( num ) ; i ++ )
        if( num[i] != num[strlen( num ) - i - 1] ) return false ;
    return true ;
}

void getnum( int number )
{
    memset( num , 0 , sizeof( num ) ) ;
    char temp[30] ;
    int  i , j ;
    int base = B ;
    i = 29 ;
    while( number != 0 )
    {
        int tmp = number % base ;
        tmp /= base / B ;
        temp[i] = function[tmp] ;
        number -= tmp * ( base / B ) ;
        base *= B ;
        i -- ;
    }
    i ++ ;
    for( j = 0 ; i <= 29 ; i ++ , j ++ )
        num[j] = temp[i] ;
}

int  main()
{
    int  i , j , number ;
    fin >> B ;
    for( i = 1 ; i <= 300 ; i ++ )
    {
        number = i * i ;
        getnum( number ) ;
        if( check() ) {
            getnum( i ) ;
            fout << num << " " ;
            getnum( number ) ;
            fout << num << endl ;
        }
    }
}

代码写得好搓啊
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics