关于 回文数 16进制的问题

为什么就是过不了测试点呢QAQ

img


 #include<stdio.h> 
#include<string.h>
#include<ctype.h> 
void  niweicunchu(char *n,char *m);
int ishuiwenshu(char *h);
int main(void)
{
    char input1[130];    
    char input2[130];
    char M[130];
    char ch;
    int a,b,c,i,j,k,f;
    int N;
  
  scanf("%d",&N);
  scanf("%s",input1);
  
  niweicunchu(input1,input2);
  
 if(N<=10)
 {
     for(k=1;k<=31;k++)
     {   if(k!=1)
         {
             b=strlen(M);
             for(i=0,c=0;i<b;i++,c++) 
               {
                 input1[i]=M[c];
            }
              niweicunchu(input1,input2);    
        }
          for(j=0;j<strlen(input1);j++)
        {
            //将M数组初始化为0,防止上一次循环的影响 
            for(i=0;i<130;i++)
            M[i]='0';
              M[j]=(input1[j]+input2[j]-'0')%N;
             M[j+1]=(input1[j]+input2[j]-'0')/N;
        }
        f=ishuiwenshu(M);
        if(f)
        break;
    }
    
     if(k<31) 
      printf("STEP=%d",k);
      else
      printf("Impossible!");
    }
    
          
  if(N==16)
  {
      for(k=1;k<=31;k++)
     {
         if(k!=1)
         {
             b=strlen(M);
             for(i=0,c=0;i<b;i++,c++) 
         {
             input1[i]=M[c];
        }
              niweicunchu(input1,input2);    
        }
        
          for(j=0;j<strlen(input1);j++)
        {
            //将M数组初始化为0,防止上一次循环的影响 
            for(i=0;i<130;i++)
            M[i]='0';
            
            if(input1[j]>='a'&&input1[j]<='z'||input1[j]>='A'&&input1[j]<='Z')
            {
                ch=tolower(input1[j]);
                switch(ch)
            {
                
                case'a':input1[j]='10';
                        break;
                case'b':input1[j]='11';
                        break;
                case'c':input1[j]='12';
                        break;
                case'd':input1[j]='13';
                        break;
                case'e':input1[j]='14';
                        break;
                case'f':input1[j]='15';
                        break;
                default:break;
            }
            
            }
            if(input2[j]>='a'&&input2[j]<='z'||input2[j]>='A'&&input2[j]<='Z')
            {
                ch=tolower(input2[j]);
                switch(ch)
            {
                
                case'a':input2[j]='10';
                        break;
                case'b':input2[j]='11';
                        break;
                case'c':input2[j]='12';
                        break;
                case'd':input2[j]='13';
                        break;
                case'e':input2[j]='14';
                        break;
                case'f':input2[j]='15';
                        break;
                default:break;
            }
            }
            
        
              M[j]=(input1[j]+input2[j]-'0')%N;
             M[j+1]=(input1[j]+input2[j]-'0')/N;
        }
        f=ishuiwenshu(M);
        if(f)
        break;
    }
     if(k!=31) 
      printf("STEP=%d",k);
      else
      printf("Impossible!");
          b=strlen(M);
         for(i=0,c=0;i<b;i++,c++) 
         {
             input1[i]=M[c];
        }
      
  }
  
  
  return 0;
} 
    //在结束计算前或得到回文数前,逆位存储数字 
void  niweicunchu(char* n,char * m)
   {
        int a,b;
        int i;
        a=strlen(n);
         
        for(i=0,b=a-1;i<a;i++,b--)
          m[i]=n[b];
      }
          
//判断是否是回文数 
int ishuiwenshu(char* h)
{
    int n,i,j;
    n=strlen(h);
    for(i=0, j=n-1;i<n;i++,j--)
    {
        if(h[i]!=h[j])
        return 0;
    }
    
    return 1;
}

很明显,在将十六进制字符转换为数字时,应该使用对应的ASCII码值减去48(字符'0'的ASCII码)或者对应字母的ASCII码值减去55(字符'A'的ASCII码),而不是直接赋成字符形式的数字。你这得修改一下

下面是修正后的代码:

if(input1[j]>='a'&&input1[j]<='z'||input1[j]>='A'&&input1[j]<='Z')
{
    ch=tolower(input1[j]);
    switch(ch)
    {
        case 'a':
            input1[j] = 10;
            break;
        case 'b':
            input1[j] = 11;
            break;
        case 'c':
            input1[j] = 12;
            break;
        case 'd':
            input1[j] = 13;
            break;
        case 'e':
            input1[j] = 14;
            break;
        case 'f':
            input1[j] = 15;
            break;
        default:
            break;
    }
}
if(input2[j]>='a'&&input2[j]<='z'||input2[j]>='A'&&input2[j]<='Z')
{
    ch=tolower(input2[j]);
    switch(ch)
    {
        case 'a':
            input2[j] = 10;
            break;
        case 'b':
            input2[j] = 11;
            break;
        case 'c':
            input2[j] = 12;
            break;
        case 'd':
            input2[j] = 13;
            break;
        case 'e':
            input2[j] = 14;
            break;
        case 'f':
            input2[j] = 15;
            break;
        default:
            break;
    }
}

在这里,我们将字符'A'-'F'转换为10-15,以便进行后续的计算。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^