i从1开始枚举到300,每次都对i进行b进制转化,转化时的每一位都放到v里面。 同时对也进行进制转换。转化的每一位都放到v2里面,最后遍历v2,判断是否是回文串。
如果是回文串,先把v1里面的所有元素输出,再把v2里面的所有元素输出。
刚开始是这样写的,基本逻辑实现了,但是题目还有一个要求,所以大于9的数字都要求转化为字母,所以还要再写个s2i()函数
#include<bits/stdc++.h>
using namespace std;
int flag;
vector<int>v,v2;
void sovel(int x,int b)
{
int t=x;
v.clear();
while(t)
{
v.push_back(t%b);
t/=b;
}
}
void sovel2(int x,int b)
{
v2.clear();
while(x)
{
v2.push_back(x%b);
x/=b;
}
}
int main()
{
int b;cin>>b;
for(int i=1;i<=300;i++)
{
flag=0;
sovel(i,b);
sovel2(i*i,b);
for(int m=0,n=v2.size()-1;m<v2.size();m++,n--)
{
if(v2[m]!=v2[n])flag=1;
}
if(flag==0)
{
reverse(v.begin(),v.end());
for(auto& it:v)cout<<it;
cout<<" ";
for(auto& it:v2)cout<<it;
cout<<endl;
}
}
return 0;
}
AC代码
#include<bits/stdc++.h>
using namespace std;
int flag;
vector<char>v,v2;
char s2i(int x)
{
if(x<=9)return x+'0';
else return x-10+'A';
//A的ASCII是65 B的是66……
//当x为11时 11-10=1 1+65=66 所以11映射完就是B
}
void sovel(int x,int b)
{
int t=x;
v.clear();
while(t)
{
v.push_back(s2i(t%b));
t/=b;
}
}
void sovel2(int x,int b)
{
v2.clear();
while(x)
{
v2.push_back(s2i(x%b));
x/=b;
}
}
int check(vector<char>v2)
{
for(int m=0,n=v2.size()-1;m<v2.size();m++,n--)
{
if(v2[m]!=v2[n])return 1;
}
return 0;
}
int main()
{
int b;cin>>b;
for(int i=1;i<=300;i++)
{
flag=0;
sovel(i,b);
sovel2(i*i,b);
flag=check(v2);
if(flag==0)
{
reverse(v.begin(),v.end());
for(auto& it:v) cout<<it;
cout<<" ";
for(auto& it:v2)cout<<it;
cout<<endl;
}
}
return 0;
}