原来的冗长的实现。。。
#include <bits/stdc++.h>
using namespace std;
const int N=300;
unordered_map<int, char> M={
{0,'0'},
{1,'1'},
{2,'2'},
{3,'3'},
{4,'4'},
{5,'5'},
{6,'6'},
{7,'7'},
{8,'8'},
{9,'9'},
{10,'A'},
{11,'B'},
{12,'C'},
{13,'D'},
{14,'E'},
{15,'F'},
{16,'G'},
{17,'H'},
{18,'I'},
{19,'J'}
};
bool check_palin(vector<char> s) {
for (int i=0, j=s.size()-1; i<j; i++, j--) {
if (s[i]!=s[j]) return false;
}
return true;
}
vector<char> convert(int n, int b) {
vector<char> s;
while (n) {
s.push_back(M[n%b]);
n/=b;
}
reverse(s.begin(), s.end());
return s;
}
void pr(vector<char> &s) {
for (int i=0; i<s.size(); i++) cout<<s[i];
}
int main() {
int b;
cin>>b;
for (int i=1; i<=N; i++) {
int n=i*i;
auto s=convert(n, b);
if (check_palin(s)) {
auto s1=convert(i, b);
pr(s1);
cout<<' ';
pr(s);
cout<<'\n';
}
}
return 0;
}
精简!
#include <bits/stdc++.h>
using namespace std;
int n;
char get(int n) {
if (n<10) return n+'0';
return n-10+'A';
}
string base(int n, int i) {
string s;
while (i) {
s+=get(i%n);
i/=n;
}
reverse(s.begin(), s.end());
return s;
}
bool check(string s) {
for (int i=0, j=s.size()-1; i<j; i++, j--) {
if (s[i]!=s[j]) return false;
}
return true;
}
int main() {
cin>>n;
for (int i=1; i<=300; i++) {
auto s=base(n, i*i);
if (check(s)) cout<<base(n, i)<<' '<<s<<'\n';
}
return 0;
}
再转换回去!
#include <bits/stdc++.h>
using namespace std;
int n;
char get(int n) {
if (n<10) return n+'0';
return n-10+'A';
}
string base(int n, int i) {
string s;
while (i) {
s+=get(i%n);
i/=n;
}
reverse(s.begin(), s.end());
return s;
}
bool check(string s) {
for (int i=0, j=s.size()-1; i<j; i++, j--) {
if (s[i]!=s[j]) return false;
}
return true;
}
int uget(char c) {
if (c-'0'<10) return c-'0';
return c-'A'+10;
}
int revert(string s) {
int res=0;
for (int i=0; i<s.size(); i++) {
res=res*10+uget(s[i]);
}
return res;
}
int main() {
cin>>n;
for (int i=1; i<=300; i++) {
auto s=base(n, i*i);
cout<<i<<' '<<revert(s)<<endl;
// if (check(s)) cout<<base(n, i)<<' '<<s<<'\n';
}
return 0;
}