输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
输入格式:
输入在一行中给出一个以#结束的非空字符串。
输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
输入样例:
+-P-xf4+-1!#
输出样例:
-3905
代码实现
#include<stdio.h>
#define MAXN 100
int main(){
char ch[MAXN],result[MAXN];
int i=0,j,count,nega;//nega负数标记
int sum=0;//最终结果
while((ch[i]=getchar())!='#'){
i++;
}
ch[i]='\0';
//0-9/a-f/A-F/-
i=nega=count=0;
while(ch[i]!='\0'){
if(ch[i]>='0'&&ch[i]<='9'||ch[i]>='a'&&ch[i]<='f' ||\
ch[i]>='A'&&ch[i]<='F')
break;
i++;
}
count=i;//16进制字符首次出现位置
i=0;
while(i<count){//在16进制字符前面发现有-号,则标记
if(ch[i]=='-')
nega=1;
i++;
}
//将16进制字符都输入目标数组中
i=j=0;
while(ch[i]!='\0'){
if(ch[i]>='0'&&ch[i]<='9'||ch[i]>='a'&&ch[i]<='f' ||\
ch[i]>='A'&&ch[i]<='F')
result[j++]=ch[i];
i++;
}
result[j]='\0';
//result={f,4,1,'\0'}
//遍历目标数组字符,转换为整数
i=0;
while(result[i]!='\0'){
if(result[i]>='a'&&result[i]<='f')
sum=sum*16+result[i]-'a'+10;
else if(result[i]>='A'&&result[i]<='F')
sum=sum*16+result[i]-'A'+10;
else if(result[i]>='0'&&result[i]<='9')
sum=sum*16+result[i]-'0';
else
;
i++;
}
if(nega)//如果是负数,要转换
sum=-sum;
printf("%d",sum);
return 0;
}