【问题描述】输入一个以’#‘结束的字符串,滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数的字符串,然后将其转化为十进制数后输出。如果过滤后字符串的首字符为’-’,代表的是负数。
【输入形式】一个字符串
【输出形式】一个十进制整数
【样例输入】+P-xf4±1!#
【样例输出】-3905
【样例说明】输入的内容,按十六进制数要求将数值(09,AE)和符号(在数值之前的’-’)保留,得到-f41,转换为十进制后是-3905
#include <stdio.h>
#include <math.h>
int main()
{
int i,flag=1,k;
char hexad[80],str[80];
long number=0;
// 输入字符串
i=0;
while ((str[i] = getchar() )!='#') {
i++;
}
str[i]='\0';
// 滤去非十六进制字母,保留所有'-'
k=0;
for (i=0;str[i]!='\0'; i++)
if ((str[i]>='0'&&str[i]<='9')||(str[i]>='a'&&str[i]<='f')||(str[i]>='A'&&str[i]<='F')||str[i]=='-') {
hexad[k]=str[i];
k++;
}
hexad[k]='\0';
for (i=0; hexad[i]!='\0'; i++) {
if(hexad[i]>='0'&&hexad[i]<='9')
number=number*16+hexad[i]-'0';
else if (hexad[i]>='A'&&hexad[i]<='F')
number=number*16+hexad[i]-'A'+10;
else if (hexad[i]>='a'&&hexad[i]<='f')
number=number*16+hexad[i]-'a'+10;
}
if (hexad[0]=='-')
flag=-1;
else
flag=1;
printf("%ld",flag*number);
}