PTA字符串转换成十进制整数

mac2025-05-23  39

初闻不知曲中意,再闻已是曲中人

去年此时正被这套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; }
最新回复(0)