P1015 [NOIP1999 普及组] 回文数 [模拟 / 高精]

Posted 幽殇默

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1015 [NOIP1999 普及组] 回文数 [模拟 / 高精]相关的知识,希望对你有一定的参考价值。

在这里插入图片描述
https://www.luogu.com.cn/problem/P1015

用long long 可以卡过,不过本题考察的是高精

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int n;
string m;
unsigned long long  D(string x)//转换成10进制
{
    unsigned long long int sum=0;
    for(int i=0;i<x.size();i++)
    {
        if(x[i]>='A') sum=sum*n+x[i]-'A'+10;
        else sum=sum*n+x[i]-'0';
    }
    return sum;
}
string to_n(unsigned long long int x)//转换成n进制
{
    string ans;
    while(x)
    {
        int temp=x%n;
        char c;
        if( temp <=9 ) c=temp+'0',ans+=c;
        else c=temp+'A'-10,ans+=c;
        x/=n;
    }
    reverse(ans.begin(),ans.end());
    return ans;
}
bool judge(string m)//判断
{
    int temp=m.size();
    for(int i=0;i<temp/2;i++) if(m[i]!=m[temp-1-i]) return false;
    return true;
}
int main(void)
{
    cin>>n>>m;
    int ans=1;
    bool flag=false;
    while(1)
    {
        unsigned long long int a=D(m);
        reverse(m.begin(),m.end());
        unsigned long long int b=D(m);
        m=to_n(a+b);
        if(judge(m)) flag=true;
        if(flag) break;
        ans++;
        if(ans>=30) break;
    }
    if(flag) cout<<"STEP="<<ans<<endl;
    else cout<<"Impossible!"<<endl;
    return 0;
}

以上是关于P1015 [NOIP1999 普及组] 回文数 [模拟 / 高精]的主要内容,如果未能解决你的问题,请参考以下文章

NOIP1999普及组解题报告

旅行家的预算 1999年NOIP全国联赛普及组NOIP全国联赛提高组

1309:例1.6回文数(Noip1999)

[2016年NOIP普及组] 回文日期

P1015 回文数

[luogu p1015] 回文数