题目描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个十进制数56,将56加65(即把56从右向左读),得到121是一个回文数。
又如:对于十进制数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
样例输入
10
87
样例输出
STEP=4
其实还是高精度加法,不过本题加了一个N进制的设定,考虑到16进制数存在字母的情况,需要分开处理
#include<iostream>
#include<cstdlib>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
// 根据进制数将数字转成相应的字符
string numToStr(int num,int n){
if(num>=10&&n==16){
switch(num){
case 10:return "A";break;
case 11:return "B";break;
case 12:return "C";break;
case 13:return "D";break;
case 14:return "E";break;
case 15:return "F";break;
}
}
return to_string(num);
}
int strToNum(char ch,int n){
if(n==16&&(ch>'9'||ch<'0')){
switch(ch){
case 'A':return 10;break;
case 'B':return 11;break;
case 'C':return 12;break;
case 'D':return 13;break;
case 'E':return 14;break;
case 'F':return 15;break;
}
}
return ch-'0';
}
// n进制c超长数字加减法
string getsum(string s1,string s2,int n){
reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end());
string sum="";
string maxstr=s1.length()>s2.length()?s1:s2;
int minlen=s1.length()>s2.length()?s2.length():s1.length();
// cc表示进位
int temp=0,cc=0;
for(int i=0;i<minlen;i++){
// cout<<s1[i]<<":"<<strToNum(s1[i],n)<<" "<<s2[i]<<":"<<strToNum(s1[i],n)<<endl;
temp=cc+strToNum(s1[i],n)+strToNum(s2[i],n);
cc=temp/n;
sum+=numToStr(temp%n,n);
}
for(int i=minlen;i<maxstr.length();i++){
temp=cc+strToNum(maxstr[i],n);
cc=temp/n;
sum+=numToStr(temp%n,n);
}
if(cc!=0) sum+=numToStr(cc,n);
reverse(sum.begin(),sum.end());
return sum;
}
int main(){
int n,flag=0;
cin>>n;
string str;
cin>>str;
// 相加次数
int addtime=0;
string re_str=str;
reverse(re_str.begin(),re_str.end());
// 如果str不是回文数
while(addtime<=30){
if(str==re_str){
flag=1;
break;
}
str=getsum(str,re_str,n);
re_str=str;
addtime++;
reverse(re_str.begin(),re_str.end());
}
if(flag==0) cout<<"Impossible!"<<endl;
else cout<<"STEP="<<addtime<<endl;
}