思路还是很清晰的:
- 接收输入
- 构造相加(倒序相加)(个人是按照大整数加法的规格来的)
- 对结果判断是否为回文数(单独写一个函数进行回文判断isPalindrome)
- 循环二、三步
- 打印输出
这里重点说几个注意点(本人犯的错,拿出来给大伙乐呵乐呵):
- 输入可以是16进制,即输入有可能含有正确的字母
- 每一位相加后不发生进位一定是回文数,但每一位相加后发生进位也有可能是回文数(如56+65)
1 #include<iostream> 2 #include<cstring> 3 #include<cctype> 4 5 using namespace std; 6 const int N=1005; 7 8 bool isPalindrome(int a[]){ 9 for(int i=1;i<=a[0]/2;i++){ 10 if(a[i]!=a[a[0]-i+1])return 0; 11 } 12 return 1; 13 } 14 int main(){ 15 int n,m[N]; 16 char str[N]; 17 cin>>n>>str; 18 //初始化数据 19 memset(m,0,sizeof(m)); 20 m[0]=strlen(str); 21 for(int i=1;i<=m[0];i++){ 22 //注意16进制 23 char c=str[m[0]-i]; 24 if(isdigit(c)){ 25 m[i]=c-48; 26 } 27 else if(islower(c)){ 28 m[i]=c-'a'+10; 29 }else{ 30 m[i]=c-'A'+10; 31 } 32 } 33 //核心算法 34 int i=0; 35 while(++i<=30){ 36 int carry=0; 37 for(int j=1;j<=m[0];j++){ 38 if(j<=m[0]/2){ 39 m[j]+=m[m[0]-j+1]; 40 }else if(m[0]%2&&j==m[0]/2+1){ 41 m[j]*=2; 42 }else{ 43 m[j]=m[m[0]-j+1]; 44 } 45 } 46 for(int j=1;j<=m[0];j++){ 47 int tmp=m[j]+carry; 48 m[j]=tmp%n; 49 carry=tmp/n; 50 } 51 if(carry){ 52 m[0]++; 53 m[m[0]]=carry; 54 } 55 if(isPalindrome(m))break; 56 } 57 58 if(i>30)cout<<"Impossible"; 59 else{ 60 cout<<i; 61 } 62 return 0; 63 }