usaco Palindromic Squares 解题报告
题意:
回文数是指从左向右念和从右向左念都一样的数。如12321就是一个典型的回文数。
给定一个进制B(2<=B<=20,由十进制表示),输出所有的大于等于1小于等于300(十进制下)且它的平方用B进制表示时是回文数的数。用’A’,’B’……表示10,11等等。
题解:数制转换一下
代码:
/*ID: lishicaoPROG: palsquareLANG: 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 ; } }}