1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #include <iostream> #include <cstdio> using namespace std; string m,toc= "0123456789abcdef" ; int n,cnt; string rev(string s) //翻转字符串 { string res= "" ; for ( int i=s.size();i>0;--i) res+=s[i-1]; return res; } bool hw(string s) //判断是否为回文 { string s1,s2; s1=s.substr(0,s.size()/2); s2=s.substr(s.size()/2+s.size()%2,s.size()/2); return s1==rev(s2); } int main() { freopen ( "huiwen.in" , "r" ,stdin); freopen ( "huiwen.out" , "w" ,stdout); cin>>n>>m; for ( int i=0;i<m.size();++i) if ( isalpha (m[i])) m[i]=m[i]- 'a' +10; //若为字母,转化为相应数字 else m[i]=m[i]- '0' ; //转化为相应数字 string a,b; int g; while (cnt++<=30){ a=rev(m); b= "" ; g=0; for ( int i=0;i<m.size();++i){ //高精度加法 b+= char ((a[i]+m[i]+g)%n); g=(a[i]+m[i]+g)/n; } if (g>0) b+= char (1); //处理进位 m=b; if (hw(b)) { //若回文,输出并结束 for ( int i=0;i<b.size();++i) b[i]=toc[b[i]]; cout<<b<<endl<<cnt; return 0; } } cout<< "impossible" ; return 0; } |
3
11
2015
11
2015