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

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

去年此时正被这套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;
}
发布了63 篇原创文章 · 获赞 34 · 访问量 6576

猜你喜欢

转载自blog.csdn.net/SinclairWang/article/details/102855585
今日推荐