zoukankan      html  css  js  c++  java
  • 1309:【例1.6】回文数(Noip1999)

    传送门:http://ybt.ssoier.cn:8088/problem_show.php?pid=1309

    【题目描述】

    若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 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.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible” 。

    【输入】

    给定一个N(2<N<=10或N=16)进制数M。

    【输出】

    最少几步。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”。

    【输入样例】

    9 87

    【输出样例】

    6



    注意有16进制位因此要专门判断,再模拟即可

    #include<iostream>
    #include<cstring>
    #define N 310
    using namespace std;
    int a[N],lena;
    bool hw(){
        for(int i=0;i<=lena/2;i++)
            if(a[i]!=a[lena-i-1])return false;
        return true;
    }
    int main(){
        int n;
        string m;
        cin>>n>>m;
        lena=m.size();
        for(int i=0;i<lena;i++)
        {
            if(m[i]>='0'&&m[i]<='9')a[i]=m[lena-i-1]-'0';
            else a[i]=(m[lena-i-1]-'A')+10;
        }
        if(hw()==true){cout<<0<<endl;return 0;}
        for(int i=1;i<=30;i++){
            for(int j=0;j<=lena/2;j++)a[j]+=a[lena-j-1];
            for(int j=lena/2;j<lena;j++)a[j]=a[lena-j-1];
            for(int j=0;j<lena;j++)
            {
                if(a[j]>=n){
                    a[j+1]++;
                    a[j]-=n;
                    if(j==lena-1)lena++;
                }
            }
            if(hw()){
                cout<<i<<endl;
                return 0;
            }
        }
        cout<<"Impossible
    ";
    }
    
    
  • 相关阅读:
    bzoj 1367
    codeforces 757F
    bzoj 3600
    比赛环境设置
    线段树合并
    BZOJ2105: 增强型LCP
    BZOJ3156: 防御准备
    BZOJ3252: 攻略
    BZOJ2464: 中山市选[2009]小明的游戏
    Beta Round #9 (酱油杯noi考后欢乐赛)乌鸦喝水
  • 原文地址:https://www.cnblogs.com/jzxnl/p/11030248.html
Copyright © 2011-2022 走看看