P1015 回文数

Posted 橘生淮南终洛枳

tags:

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

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

以上是关于P1015 回文数的主要内容,如果未能解决你的问题,请参考以下文章

[luogu p1015] 回文数

洛谷 P1015 回文数 Label:续命模拟QAQ

P1015 [NOIP1999 普及组] 回文数 [模拟 / 高精]

怎么用python写判断回文数

python编程,回文数判断?

代码题(16)— 回文