高精度练习- 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=162≤N≤10,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; }