初闻不知曲中意,再闻已是曲中人
去年此时正被这套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;
ll res
= convertres(v
);
if(!postive
) res
*= -1;
cout
<< res
<< endl
;
return 0;
}