数组-08. 字符串转换成十进制整数(15)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
张彤彧(浙江大学)
输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果过滤后字符串的首字符为“-”,代表该数是负数。
输入格式:
输入在一行中给出一个以#结束的非空字符串。
输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
输入样例:+P-xf4+-1!#输出样例:
-3905
#include <iostream>
#include <string>
#include <cctype>
#include <cmath>
#include <vector>
using namespace std;
int main()
{
string word;
cin >> word;
for (auto &i : word)
{
//if(isalpha(i)) //这个if不加仍然正确,函数不会改变非字母的值
i = toupper(i);
}
char hex[17] = {'0', '1', '2', '3', '4', '5', '6',
'7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', '-'
};
// string hexnum;
// 这样是不行的,因为假如是AF的话,变成字符串1015,就不知道怎么划分数了!
// 要用vector来保存数!
vector<char> hexnum;
for (auto i : word)
{
if(i=='#'){
break;
}
for (int t = 0; t < 17; ++t)
{
if (i == hex[t])
{
hexnum.push_back(i);
}
}
}
int sign = 0;
if (hexnum[0] == '-')
{
sign = 1;
}
int flag=hexnum.size(); //16进制数目
// int flag = hexnum.size() - 1; 不能用这个,因为这时里面还残留‘-’,要再把-给消去
for(auto i : hexnum){
if(i=='-')
--flag;
}
flag-=1; //这个flag代表上16的次数
long long sum = 0;
for (auto i : hexnum)
{
if (i != '-')
{
for (int t=0; t < 16; ++t)
{
if(i==hex[t])
sum += t * pow(16, flag--);
}
}
}
if (sign == 1)
{
cout << '-';
}
cout << sum << endl;
return 0;
}
最后有两分不能通过,不知道为什么