zoukankan      html  css  js  c++  java
  • 洛谷 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;
                }
        }
    }
  • 相关阅读:
    #JVM方法区、堆、栈’#
    #前端# 解决前端页面滑动不顺畅的问题
    【Web协议】服务器推送浏览器:Server-Sent Events(SSE)
    【性能调优】Java程序CPU高定位
    转载 I/O模型:BIO/NIO/AIO 学习
    【性能调优】Java程序内存高定位
    算法--字符串:最长回文子序列
    算法--字符串:最长递增子序列LIS
    算法--字符串:最长回文子串
    算法--字符串:最长公共子序列LCS
  • 原文地址:https://www.cnblogs.com/EvilEC/p/6885647.html
Copyright © 2011-2022 走看看