码迷,mamicode.com
首页 > 其他好文 > 详细

codevs 1045 回文数

时间:2017-05-23 22:43:54      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:描述   des   nbsp   int   bsp   log   回文   script   body   

题目描述 Description

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

    例如:给定一个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!”

输入描述 Input Description

n和m

输出描述 Output Description

步数

样例输入 Sample Input

9

87

样例输出 Sample Output

STEP=6

数据范围及提示 Data Size & Hint

e

 

分析:

模拟即可!

 

 

#include<iostream>
#include<cstring>
using namespace std;
int n,a[101];
bool pd(int len)
{
    for(int i=1;i<=len/2;++i)
    {
        if(a[i]!=a[len-i+1])return 0;
    }
    return 1;
}
void add(int &len)
{
    int t[101];
    memcpy(t,a,sizeof(a));
    for(int i=1;i<=len;++i)
    {
        a[i]+=t[len-i+1];
        a[i+1]+=a[i]/n;
        a[i]%=n;
    }
    if(a[len+1]!=0)++len;
    return ;
}
int main()
{
    int ans=0;
    cin>>n;
    char m[101];
    cin>>m;
    int len=strlen(m);
    for(int i=0;i<len;++i)
    {
        if(m[i]>=0&&m[i]<=9)a[len-i]=m[i]-0;
        else a[len-i]=m[i]-A+10;
    }
    while(!pd(len))
    {
        if(ans>30)break;
        ++ans;
        add(len);
    }
    if(ans>30)cout<<"Impossible!";
    else cout<<"STEP="<<ans;
    return 0;
}

 

 

 

codevs 1045 回文数

标签:描述   des   nbsp   int   bsp   log   回文   script   body   

原文地址:http://www.cnblogs.com/Dream-Runner/p/6896474.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!