1309:【例1.6】回文数(Noip1999)

摘要:
Pid=1309如果从左到右读取的数字与从右到左读取的数字相同,我们称之为回文数。例如,给定一个十进制数56,将65加到56,121是回文数。例如,对于十进制数87,STEP1:87+78=165STEP2:165+561=726STEP3:726+627=1353STEP4:1353+3531=4884。这里,一个步骤是指N系统的加法。在上面的例子中,至少需要四个步骤来获得回文4884。编写一个程序,给定一个N元数M。在至少几步后找到回文数。如果在30步内无法获得回文数,则输出“不可能”。

传送门: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
";
}

免责声明:文章转载自《1309:【例1.6】回文数(Noip1999)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇KAFKA架构原理app常见性能测试点下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

哈希表(hash)

散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。 (来自维基百科) 其中前边说到的离散化也是一种特殊的哈希方式,只不过离散化注重保序性,因此使用二分查找...

表示不同文件类型的魔术数字

这里所说的表示不同文件类型的魔术数字,指定是文件的最开头的几个用于唯一区别其它文件类型的字节,有了这些魔术数字,我们就可以很方便的区别不同的文件,这也使得编程变得更加容易,因为我减少了我们用于区别一个文件的文件类型所要花费的时间。 比如,一个JPEG文件,它开头的一些字节可能是类似这样的”ffd8 ffe0 0010 4a46 4946 0001 010...

Java对文件的16进制读取和操作

大家可以参考一下源代码的相关部分注释,然后写出自己的16进制处理程序。有几个重点地方:16进制字符串-》10进制数 int input = Integer.parseInt("Str", 16)10进制整数-》16进制字符串 String hex = Integer.toHexString(int)文件读取方法 作为2进制文件直接读取,一个byte为单位的...

python实现进制转换(二、八、十六进制;十进制)

python实现进制转换(二、八、十六进制;十进制) (一)十进制整数转为二、八、十六进制 1、format实现转换>>> format(2,"b") # (10进制的)2转二进制'10' >>> format(9,"o") # (10进制的)9转八进制'11' >>> format(17,"x") #...

Java 2进制和16进制的转换

Jave使用AES加密后的报文可能会出现乱码的情况,可以将它转化为16进制的字符串。 packagecom.test.aes; /*** * 进制转换工具类 * */ public classParseSystemUtil { /*** 将二进制转换成16进制 * * @parambuf * @retu...

【Matlab图像处理】学习笔记:读取16进制RGB文档转为彩色图片

在JPEG解码中对JPG图片进行了解码,解码的数据分为RGB三色,这三色数据(16进制)存放在3个文件中red.dat,green.dat,blue.dat;用matlab把这3色数据复原成图像。 这里仅对红色处理,其他两种颜色的处理方法类似。 这里解码的是一幅1080*1920的jpg图片。 red.dat文件中存放的是16进制的数据 格式如上图,这里...