1347. 双重回文 题型:思维题 简单一次过

65 阅读1分钟

1347. 双重回文 - AcWing题库

思想: 枚举比S大的数i,如果说i转二进制到10进制至少满足有种进制是回文进制,那么就输出,如果输出了N个i,那么就break掉。

#include<bits/stdc++.h>
using namespace std;
int N,S,cnt,sum1,sum2,kind;
vector<int>v1,v2;


//检查传入的i的某种进制是否是回文进制  
bool jin(int x,int D)
{
    sum1=0,sum2=0;
    v1.clear();v2.clear();
    int temp=x;
    while(temp)
    {
        v1.push_back(temp%D);
        temp/=D;
    }
    
    v2=v1;
    for(auto& it:v1)sum1=sum1*10+it;
    reverse(v2.begin(),v2.end());

    for(auto& it:v2)sum2=sum2*10+it;
    if(sum1==sum2)return true;
return false;
}


//检查i从 2进制到 10进制 中是否满足 至少有2种进制是回文进制。
bool check(int x)
{ 
    kind=0;
    for(int D=2;D<=10;D++)
    {
            if(jin(x,D))
            {
                kind++;
            }
    }
if(kind>=2)return true;
 return false;
}


//输出大于S的N个满足至少2种进制的数i
void sovel()
{
    cin>>N>>S;
    for(int i=S+1;;i++)
    {
        if(check(i))
        {
            cout<<i<<endl;
            cnt++;
        }
        if(cnt==N)
        {
            break;
        }
    }
    
}

int main()
{

    int t=1;
    while(t--)
    sovel();
    
    return 0;
}