[成绩]
[报告]
这个不解释,弄回文的时候,把整数改成高精度的时候弄反了……
其实就只要枚举就可以了。这个范围不大。
N从1枚举到300,计算出在B进制下N*N的值(我是先算N*N,再转成B进制,如果用高精度,太麻烦了 ),然后判断N*N是否为回文。
[程序]
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <fstream>
#include <string>
using namespace std;
const string al="0123456789ABCDEFGHIJKLMN";
ifstream fin ("palsquare.in");
ofstream fout ("palsquare.out");
long b,s;
int main ()
{
fin >> b;
s=0;
for (long n=1;n<=300;n++)
try
{
s=s+2*n-1;
string ls="",ln="";
long ss=s;
while (ss>0)
{
ls+=al[ss%b];
ss/=b;
}
for (long i=0,j=ls.length()-1;i<j;i++,j--)
if (ls[i]!=ls[j])
throw 1;
ss=n;
while (ss>0)
{
ln+=al[ss%b];
ss/=b;
}
for (long i=ln.length()-1;i>=0;i--)
fout << ln[i];
fout << " " << ls << endl;
}catch(int aabababa)
{
[报告]
这个不解释,弄回文的时候,把整数改成高精度的时候弄反了……
其实就只要枚举就可以了。这个范围不大。
N从1枚举到300,计算出在B进制下N*N的值(我是先算N*N,再转成B进制,如果用高精度,太麻烦了 ),然后判断N*N是否为回文。
[程序]
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <fstream>
#include <string>
using namespace std;
const string al="0123456789ABCDEFGHIJKLMN";
ifstream fin ("palsquare.in");
ofstream fout ("palsquare.out");
long b,s;
int main ()
{
fin >> b;
s=0;
for (long n=1;n<=300;n++)
try
{
s=s+2*n-1;
string ls="",ln="";
long ss=s;
while (ss>0)
{
ls+=al[ss%b];
ss/=b;
}
for (long i=0,j=ls.length()-1;i<j;i++,j--)
if (ls[i]!=ls[j])
throw 1;
ss=n;
while (ss>0)
{
ln+=al[ss%b];
ss/=b;
}
for (long i=ln.length()-1;i>=0;i--)
fout << ln[i];
fout << " " << ls << endl;
}catch(int aabababa)
{