字符串转换成十进制整数 (15分)
-
输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。 输入格式:
输入在一行中给出一个以#结束的非空字符串。 输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。 输入样例:
+-P-xf4+-1!#
输出样例:
-3905
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
char a[10000000];///开辟足够大的数组
int b[10000000];/// 盛放 转换后的十进制数据
int main()
{
scanf("%s",a);
int j=0;
int i;
for( i=0; a[i]!='#'; i++)/// 找到的一个16 进制字符
{
if( (a[i]>='0' && a[i]<='9') || (a[i]>='a' && a[i]<='f') || a[i]>='A' && a[i]<='F' )
{
break;
}
}
int flag=0;/// 判断负号
for(int k=0; k<i; k++)
{
if(a[k]=='-')
{
flag++;
break;
}
}
for( i; a[i]!='#' && a[i]; i++)
{
if(a[i]>='A' && a[i]<='Z')/// 大写转换为小写
a[i]+=32;
if( (a[i]>='0' && a[i]<='9') )
{
b[j++]=a[i]-'0';
}
if(a[i]>='a' && a[i]<='f')
{
b[j++]=a[i]-'a'+10;
}
}
long long sum=0;
int jz=1;
for(int i=j-1; i>=0; i--)
{
sum += jz*b[i];
jz*=16;
}
if(sum!=0)/// 结果为 0 不输出 负号
{
if(flag)printf("-");
}
printf("%lld\n",sum);
return 0;
}