PTA字符串转换成十进制整数
初闻不知曲中意,再闻已是曲中人
去年此时正被这套PTA题目折磨,一年之后再写这些题目,记忆尤新,经历的酸楚自然是值得的。
题目描述
输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。
输入格式:
输入在一行中给出一个以#结束的非空字符串。
输出格式:
在一行中输出转换后的十进制数。题目保证输出在长整型范围内。
输入样例:
±P-xf4±1!#
输出样例:
-3905
思路
重点在字符串的清洗上,只保留第一个负号,保留数字和十六进制字符,其余洗掉。
然后进行进制转换
实现
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;#define For1(i,m,n) for(int i=m;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;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
