输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
输入格式:
输入在一行中给出一个以#结束的非空字符串。
输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
输入样例:
+-P-xf4+-1!#
输出样例:
-3905
十六进制转十进制:
例:2AF5换算成10进制:
用竖式计算:
第0位: 5 * 16^0 = 5
第1位: F * 16^1 = 240
第2位: A * 16^2= 2560
第3位: 2 * 16^3 = 8192
-------------------------------------
10997
直接计算就是:
5 * 16^0 + F * 16^1 + A * 16^2 + 2 * 16^3 = 10997
#include <bits/stdc++.h>
using namespace std;
char s[1100];
int ss[1100];
int main()
{
gets(s);
int t,flag=0,num=0,sum=0;
for(int i=0; s[i]!='#'; i++)///注意停止寻找s[i]的终止条件
{
if((s[i]>='a'&&s[i]<='f')||(s[i]>='0'&&s[i]<='9')||(s[i]>='A'&&s[i]<='F'))
{
t=i;
break;
}
}
for(int i=0; i<t; i++)
{
if(s[i]=='-')///判断负号
{
flag=1;
break;
}
}
for(int i=0;s[i]!='#';i++)
{
if(s[i]>='A'&&s[i]<='F')///统一大小写
s[i]+=32;
if(s[i]>='a'&&s[i]<='f')
ss[num++]=s[i]-'a'+10;
if(s[i]>='0'&&s[i]<='9')
ss[num++]=s[i]-'0';
}
for(int i=0;i<num;i++)
{
int x=1;
for(int j=i;j<num-1;j++)
{
x*=16;
}
sum+=x*ss[i];
}
if(flag==1)
printf("-");
printf("%d\n",sum);
return 0;
}