高精度练习- P1015 回文数

题目描述

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

例如:给定一个十进制数5656,将5656加6565(即把5656从右向左读),得到121121是一个回文数。

又如:对于十进制数8787:

STEP1:8787+7878 = 165165
STEP2:165165+561561 = 726726
STEP3:726726+627627 = 13531353
STEP4:13531353+35313531 = 48844884

在这里的一步是指进行了一次NN进制的加法,上例最少用了44步得到回文数48844884。

写一个程序,给定一个NN(2 le N le 10,N=162N10,N=16)进制数MM(100100位之内),求最少经过几步可以得到回文数。如果在3030步以内(包含3030步)不可能得到回文数,则输出Impossible!

输入输出格式

输入格式:

两行,分别是NN,MM。

输出格式:

STEP=ans

输入输出样例

输入样例#1: 复制
10
87
输出样例#1: 复制
STEP=4


#include <iostream>
#include <algorithm>
#include <cctype>
#include <string>
using namespace std;
string add(string s1,string s2,int N){
    string ans;
    int len1 = s1.length() - 1;
    int len2 = s2.length();
    int len2s = 0;
    int s = 0;
    int re = 0;
    while(len1 >=0 || len2s < len2){
        s = re;
        if(len1>=0) s+= s1[len1--] -'0';
        if(len2>=0) s+= s2[len2s++] -'0';
        re = s/N;
        s = s%N;
        ans.push_back(s+'0');
    }
    if(re)    ans.push_back(re+'0');
    std::reverse(ans.begin(),ans.end());
    return ans;
}
bool huiwen(string s){
    for(int i = 0,j = s.length()-1;i<j;++i,--j){
        if(s[i] != s[j])
            return false;
    }
    return true;
}
int main(){
    int N;
    string s2;
    cin >> N >> s2;
    int step = 0;
    if(N==16){//处理16进制 
        for(int i=0;i<s2.length();++i){
            if(isalpha(s2[i])){
                s2[i] = s2[i] - 'A' + 10 + '0'; 
            }
        }
    }
    if(huiwen(s2)){
        cout << "STEP=" << step << endl;
        return 0;
    }
    while(step < 30){
        ++step;
        s2 = add(s2,s2,N);
        if(huiwen(s2)){
            cout << "STEP=" << step << endl;
            return 0;
        }
    }
    cout << "Impossible!" << endl;
    return 0;
}
原文地址:https://www.cnblogs.com/--zz/p/10645291.html