1309:例1.6回文数(Noip1999)

Posted jzxnl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n";

 


以上是关于1309:例1.6回文数(Noip1999)的主要内容,如果未能解决你的问题,请参考以下文章

1260:例9.4拦截导弹(Noip1999)

NOIP1999普及组解题报告

拦截导弹问题(Noip1999)

洛谷 P1015 回文数

1260:例9.4拦截导弹(Noip1999)

05:素数回文数的个数