初闻不知曲中意,再闻已是曲中人
去年此时正被这套PTA题目折磨,一年之后再写这些题目,记忆尤新,经历的酸楚自然是值得的。
题目描述
输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
输入格式:
输入在一行中给出一个以#结束的非空字符串。
输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
输入样例:
±P-xf4±1!#
输出样例:
-3905
思路
重点在字符串的清洗上,只保留第一个负号,保留数字和十六进制字符,其余洗掉。
然后进行进制转换
实现
#include<iostream>
#include<cmath>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
#define For1(i,m,n) for(int i=m;i<n;i++)
#define For2(i,m,n) for(int i=m;i>=n;i--)
// 清洗输入的字符串
vector<char> convert(string s){
vector<char> v;
int cnt = 0;
bool first = true;
For1(i,0,s.length()){
if(s[i]>='0'&&s[i]<='9'||s[i]>='a'&&s[i]<='f'||s[i]>='A'&&s[i]<='F'){
v.push_back(s[i]);
}
else if(s[i]=='-'&&first==true){
v.push_back(s[i]);
first = false;
}
}
return v;
}
// 进制转换
ll convertres(vector<char> v){
ll res = 0,cnt=0;
For2(i,v.size()-1,0){
if(v[i]>='0'&&v[i]<='9'){
res += (v[i]-'0')*pow(16,cnt);
cnt++;
}else if(v[i]>='a'&&v[i]<='f'){
res += (v[i]-'a'+10)*pow(16,cnt);
cnt++;
}
else if(v[i]>='A'&&v[i]<='F'){
res += (v[i]-'A'+10)*pow(16,cnt);
cnt++;
}
else ;
}
return res;
}
int main(){
bool postive = true;
string s;
cin >> s;
vector<char> v = convert(s);
if(v[0]=='-') postive = false;
// print
// For1(i,0,v.size()){
// cout << v[i];
// }
// cout << endl;
ll res = convertres(v);
if(!postive) res *= -1;
cout << res << endl;
return 0;
}