洛谷 P1015 回文数

Posted EvilEC 笑面

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1015 回文数相关的知识,希望对你有一定的参考价值。

 P1015 回文数

  • 标签 字符串 模拟 NOIp普及组 1999 云端
  • 难度 普及-
  • 时空限制 1s / 128MB

题目描述

若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。

例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。

又如:对于10进制数87:

STEP1:87+78 = 165 STEP2:165+561 = 726

STEP3:726+627 = 1353 STEP4:1353+3531 = 4884

在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。

写一个程序,给定一个N(2<=N<=10,N=16)进制数M(100位之内),求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”

输入输出格式

输入格式:

 

两行,分别是N,M。

 

输出格式:

 

STEP=ans

 

输入输出样例

输入样例#1:
10
87
输出样例#1:
STEP=4


#include<iostream>
#include<cstring>
#include<cstdio>
#define N 100000
using namespace std;
int a[N],b[N],h,n;
string m;
bool flag=true;
bool judge()
{
    if(flag)
    {
        for(int i=1;i<=h/2;i++)
            if(a[i]!=a[h-i+1])
                return false;
        return true;
    }
    else
    {
        for(int i=1;i<=h/2;i++)
            if(b[i]!=b[h-i+1])
                return false;
        return true;
    }
}
int main()
{
    cin>>n>>m;
    h=m.length();
    for(int i=1;i<=h;i++)
    {
        int o=m[i-1]-0;
        if(o<=9)a[i]=o;
        else a[i]=o-7;
    }
    int t=0;
    while(true)
    {
        if(flag)
        {
            for(int i=1;i<=h;i++)
            {
                b[i]+=a[i]+a[h+1-i];
                if(b[i]>=n)
                {
                    b[i+1]+=b[i]/n;
                    b[i]=b[i]%n;
                }
            }
            memset(a,0,sizeof(a));
            if(b[h+1])h++;
            flag=!flag;
        }
        else
        {
            for(int i=1;i<=h;i++)
            {
                a[i]+=b[i]+b[h+1-i];
                if(a[i]>=n)
                {
                    a[i+1]+=a[i]/n;
                    a[i]=a[i]%n;
                }
            }
            memset(b,0,sizeof(b));
            if(a[h+1])h++;
            flag=!flag;
        }
        t++;
        if(judge())
        {
            cout<<"STEP="<<t;
            return 0;
        }
        else
            if(t==30)
            {
                cout<<"Impossible!";
                return 0;
            }
    }
}

 

以上是关于洛谷 P1015 回文数的主要内容,如果未能解决你的问题,请参考以下文章

P1015 回文数

[luogu p1015] 回文数

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

洛谷U3348 A2-回文数

洛谷 U3348 A2-回文数

洛谷 U3348 A2-回文数