描述
若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 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(3≤N≤10或N=16)进制数 M.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible” 。
格式
输入格式
给定一个N(3≤N≤10或N=16)进制数 M
输出格式
最少几步。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”。
样例
输入样例
9 87
输出样例
6
限制
时间限制: 1000 ms
内存限制: 65536 KB
#include<bits/stdc++.h>
using namespace std;
string M;
int N;
int ans = 0;
char num[20] = "0123456789ABCDEF";
bool palindrome(string M)
{
string re_M = M;
reverse(re_M.begin(), re_M.end());
if(re_M == M) return 1;
else return 0;
}
//十进制大整数加法
string add(string str1, string str2)
{
string str;
int len1 = str1.length();
int len2 = str2.length();
if(len1<len2)
for(int i=1; i<=len2-len1; i++)
str1 = "0" + str1;
else
for(int i=1; i<=len1-len2; i++)
str2 = "0" + str2;
len1 = str1.length();
int cf = 0, temp = 0;
for(int i=len1-1; i>=0; i--)
{
temp = 0;
if(str1[i] >= 'A')
temp += str1[i] - 'A' + 10;
else
temp += str1[i] - '0';
if(str2[i] >= 'A')
temp += str2[i] - 'A' + 10;
else
temp += str2[i] - '0';
temp += cf;
cf = temp/N; //进位
temp %= N; //进位后的本位
str = (char)num[temp] + str; //数字转字符,加到结果字符串str前
}
if(cf!=0) //若最高位进位,则加再结果str前
str = (char)num[cf] + str;
return str;
}
string trans(string M) //字符串反转载相加
{
string re_M = M;
reverse(re_M.begin(), re_M.end());
return add(M, re_M);
}
int main()
{
cin >> N >> M;
while( palindrome(M)==0 && ans <= 30)
{
M = trans(M);
ans++;
}
if(ans <= 30)
cout << ans ;
else
cout << "Impossible";
return 0;
}