P1015 回文数

 

P1015 回文数

题目描述

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

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

 思路:

  运用学习高精度加法时的思想 用字符串来存储数据 然后进行字符串的加法,在比较的时候注意判断 判断不成立ans++ 一直到30或者判断成功输出

#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;

const int maxn = 1005;
int a[maxn],N;

void in(int a[]) {
    string str;
    cin>>N>>str;
    a[0] = str.length();
    for(int i = 1; i <= a[0]; i++) {
        if(str[a[0] - i] >= '0' && str[a[0] - i] <= '9') a[i] = str[a[0] - i] - '0';
        else a[i] = str[a[0] - i] - 'A' + 10;
    }
}

inline bool check(int a[]) {
    for(int i=1; i<=a[0]; i++)
        if(a[i]!=a[a[0]-i+1]) return false;
    return true;
}

inline void Plus(int a[]) {
    int b[maxn];
    for(int i=1; i<=a[0]; i++) b[i]=a[a[0]-i+1];
    for(int i=1; i<=a[0]; i++) a[i]+=b[i];
    for(int i=1; i<=a[0]; i++) {
        a[i+1]+=a[i]/N;
        a[i]%=N;
    }
    while(a[a[0]+1]>0) a[0]++;
    return;
}
int main() {
    in(a);
    if(check(a)) {
        cout<<"STEP=0";
        return 0;
    }
    int ans=0;
    while(ans<=30) {
        ans++;
        Plus(a);
        if(check(a)) {
            cout<<"STEP="<<ans;
            return 0;
        }
    }
    cout<<"Impossible!";
    return 0;
}
回文数

自己选的路,跪着也要走完!!!

posted @ 2017-09-09 11:22  橘生淮南终洛枳  阅读(184)  评论(0编辑  收藏  举报