回文数

思路还是很清晰的:

  1. 接收输入
  2. 构造相加(倒序相加)(个人是按照大整数加法的规格来的
  3. 对结果判断是否为回文数(单独写一个函数进行回文判断isPalindrome)
  4. 循环二、三步
  5. 打印输出

 

这里重点说几个注意点本人犯的错,拿出来给大伙乐呵乐呵

  • 输入可以是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 }