输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
输入格式:
输入在一行中给出一个以#结束的非空字符串。
输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
输入样例:
+-P-xf4+-1!#
输出样例:
-3905
以下为原答案
#include <stdio.h>
#include <math.h>
int main (void)
{
int i = 0, j = 0, k = 0;
long number = 0;
char a[100]={0}, b[100]={0};
while (1) //输入数组a
{
scanf ("%c", &a[i]);
if (a[i] == '#')
{
break;
}
i++;
}
for (j = 0;j < i;j++) //将a数组中包含‘-’的且符合条件的字符赋给数组b,也用于判断number的正负
{
if ((a[j] >= 'a' && a[j] <= 'f') || (a[j] >= 'A' && a[j] <= 'F') || (a[j] >= '0' && a[j] <= '9') || (a[j] == '-'))
{
b[k] = a[j];
k++;
}
}
char c[100] = {0};
int n=0;
for (j = 0;j < k;j++) //将b数组中不含‘-’的符合条件的赋给数组c
{
if ((b[j] >= 'a' && b[j] <= 'f') || (b[j] >= 'A' && b[j] <= 'F') || (b[j] >= '0' && b[j] <= '9'))
{
c[n] = b[j];
n++;
}
}
for (j = 0;j < n;j++) //将十六进制转化为十进制
{
if (c[j] >= 'a' && c[j] <= 'f')
{
number = number + (c[j] - 'a' +10)*pow(16,n-j-1);
}
else if (c[j] >= 'A' && c[j] <= 'F')
{
number = number + (c[j] - 'A' +10)*pow(16,n-j-1);
}
else if (c[j] >= '0' && c[j] <= '9')
{
number = number + (c[j] - '0')*pow(16,n-j-1);
}
}
if (b[0] == '-') //如果b数组的第一个字符为‘-’,则number为负,否则为正
{
number = -number;
}
printf ("%d",number); //输出
return 0;
}