描述
回文数是指从左向右念和从右向左念都一样的数。
如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
程序:
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("palsquare.in");
ofstream fout ("palsquare.out");
const char a[21] = {'0','1','2','3','4','5','6','7','8','9','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K'};
int n;
void get(int t)
{
string s("");
int m = t * t;
do
{
s = a[m % n] + s;
m /= n;
} while (m > 0);
bool mark(true);
for (int i = 0; i <= s.size() / 2 - 1; i++)
if (s[i] != s[s.size() - i - 1])
{
mark = false;
break;
}
string w("");
do
{
w = a[t % n] + w;
t /= n;
} while (t > 0);
if (mark == true || s.size() == 1)
fout << w << " " << s << endl;
}
int main(void)
{
fin >> n;
for (int i = 1; i <= 300; i++)
get(i);
}
这个牛逼~!:
#include<iostream>
using namespace std;
int B;
const
int MAX=300;
char CH[20]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J'};
void printdata(int x)
{
int a[30],i=0;
while (x>0) a[++i]=x%B,x/=B;
for (;i;cout<<CH[ a[i--] ]);
}
void handle( int x )
{
int a[30],n=0,xx=x*x;
while (xx>0) a[++n]=xx%B,xx/=B;
int t=n;
for (;(n>0)&&(a[n]==a[t-n+1]);--n);
if (n==0) printdata(x),cout<<' ',printdata(x*x),cout<<endl; }
int main()
{
freopen("palsquare.in","r",stdin);
freopen("palsquare.out","w",stdout);
cin>>B;
for (int i=1;i<=MAX;i++) handle(i);
return 0;
}。