输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
输入格式:
输入在一行中给出一个以#结束的非空字符串。
输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
输入样例:
±P-xf4±1!#
输出样例:
-3905
#include <stdio.h>
#include<math.h>
int ChangeChar(char s);
int main()
{
char a[10];
char ch;
int flag=0;
int flag2=1;
int i=0;
for(;(ch=getchar())!='#';)//输入
{
if(ch=='-'&&flag==0)//如果是在16进制字符之前就有'-'
flag2=-1;
if((ch>='0'&&ch<='9')||(ch>='a'&&ch<='f')||(ch>='A'&&ch<='F'))
{
a[i++]=ch;
flag=1;
}
}
a[i]='\0';
int sum=0;
int k=0;
for(int j=i-1;j>=0;j--,k++)//从后向前,k是16的幂,从0开始
{
if(a[j]>='0'&&a[j]<='9')
{
sum+=(a[j]-'0')*pow(16,k);
}
else if((a[j]>='A'&&a[j]<='F')||(a[j]>='a'&&a[j]<='f'))
{
int n=ChangeChar(a[j]);
sum+=n*pow(16,k);
}
}
printf("%d",sum*flag2);
return 0;
}
int ChangeChar(char s)
{
if(s == 'a'||s == 'A')
return 10;
else if(s == 'b'||s == 'B')
return 11;
else if(s == 'c'||s == 'C')
return 12;
else if(s == 'd'||s == 'D')
return 13;
else if(s == 'e'||s == 'E')
return 14;
else
return 15;
}