题意:
代码写得好搓啊
回文数是指从左向右念和从右向左念都一样的数。如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 ;
}
}
}
代码写得好搓啊