字符串转换成十进制整数 (15分)
输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
输入格式:
输入在一行中给出一个以#结束的非空字符串。
输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
输入样例:
+-P-xf4+-1!#
输出样例:
-3905
代码:
#include<stdio.h>
#include<string.h>
int ci(int flag)//求16的flag次方
{
int i;
if(flag == 0) return 1;//0次方 返回1
else{
int sum = 1;
for(i = 0; i < flag; i++)
{
sum = sum * 16;
}
return sum;
}
}
int main()
{
char a[1000];
char c[1000];//栈
int i, len, flag, top, r, sum;
while(~scanf("%s", a))
{
flag = 0;
top = 0;
r = 0;
len = strlen(a);
for(i = 0; i < len; i++){
if(a[i] == '-' && !flag)//如果第一个十六进制前面有负号,标记一下
{
top = 1;
}
if((a[i] >= '0' && a[i] <= '9') || (a[i] >= 'A' && a[i] <= 'F') || (a[i] >= 'a' && a[i] <= 'f'))//判断是不是十六进制符号
{
flag = 1;//遇到十六进制标记一下
c[r++] = a[i];//存入栈中
}
}
sum = 0;//转换成十进制的结果
flag = 0;
while(r != 0)
{
if(c[r - 1] >= '0' && c[r - 1] <= '9')//0到9
{
sum += ci(flag) * (c[r - 1] - '0');
flag++;
}
else if(c[r - 1] >= 'a' && c[r - 1] <= 'f')//10到15
{
sum += ci(flag) * (c[r - 1] - 'a' + 10);
flag++;
}
else if(c[r - 1] >= 'A' && c[r - 1] <= 'F')//10到15
{
sum += ci(flag) * (c[r - 1] - 'A' + 10);
flag++;
}
r--;
}
if(sum == 0) printf("%d\n", sum);
else if(top) printf("-%d\n", sum);
else printf("%d\n", sum);
}
return 0;
}