为什么就是过不了测试点呢QAQ
#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,以便进行后续的计算。
不知道你这个问题是否已经解决, 如果还没有解决的话: