1346. 回文平方 知识点:进制转换 字母映射

44 阅读1分钟

1346. 回文平方 - AcWing题库

i从1开始枚举到300,每次都对i进行b进制转化,转化时的每一位都放到v里面。 同时对i2i^2也进行进制转换。转化的每一位都放到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;
}

image.png

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;
}

image.png