习题7-8 字符串转换成十进制整数 (15 分)
1. 题目摘自
https://pintia.cn/problem-sets/12/problems/331
2. 题目内容
输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
输入格式:
输入在一行中给出一个以#结束的非空字符串。
输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
输入样例:
+-P-xf4+-1!#
输出样例:
-3905
3. 源码参考
#include<iostream>
#include<math.h>
using namespace std;
#define len 1000
int main()
{
char ch;
int f = 1;
int t;
int i, n;
int a[len];
double s;
n = 0;
do
{
cin >> ch;
if ((ch == '-') && (n == 0))
{
f = -1;
}
else if (((ch >= 'A') && (ch <= 'F'))
|| ((ch >= 'a') && (ch <= 'f'))
|| ((ch >= '0') && (ch <= '9')))
{
switch (ch)
{
case '0':
t = 0;
break;
case '1':
t = 1;
break;
case '2':
t = 2;
break;
case '3':
t = 3;
break;
case '4':
t = 4;
break;
case '5':
t = 5;
break;
case '6':
t = 6;
break;
case '7':
t = 7;
break;
case '8':
t = 8;
break;
case '9':
t = 9;
break;
case 'A':case 'a':
t = 10;
break;
case 'B':case 'b':
t = 11;
break;
case 'C':case 'c':
t = 12;
break;
case 'D':case 'd':
t = 13;
break;
case 'E':case 'e':
t = 14;
break;
case 'F':case 'f':
t = 15;
break;
default:
break;
}
a[n++] = t;
}
} while (ch != '#');
s = 0;
for (i = 0; i < n; i++)
{
s += pow(16, n - i - 1)*a[i];
}
cout << s * f << endl;
return 0;
}