PIPIOJ 1114 十六进制转换 (STL)

16进制转8进制,以二进制为桥梁,用两个map转换一下即可,然而我没想到,菜。

涉及一些我不会的string用法。

#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
const int N = 1e5+7;
string s;
unordered_map<char, string >mp1;//16->2
unordered_map<string, char >mp2;//2->8
int main() {
	mp1['0'] = "0000", mp1['1'] = "0001", mp1['2'] = "0010", mp1['3'] = "0011";
	mp1['4'] = "0100", mp1['5'] = "0101", mp1['6'] = "0110", mp1['7'] = "0111";
	mp1['8'] = "1000", mp1['9'] = "1001", mp1['A'] = "1010", mp1['B'] = "1011";
	mp1['C'] = "1100", mp1['D'] = "1101", mp1['E'] = "1110", mp1['F'] = "1111";

	mp2["000"] = '0', mp2["001"] = '1', mp2["010"] = '2', mp2["011"] = '3';
	mp2["100"] = '4', mp2["101"] = '5', mp2["110"] = '6', mp2["111"] = '7';
	while (cin >> s) {
		string t, ans;
		for (int i = 0; i < s.size(); i++) {
			t = t + mp1[s[i]];
		}
		if (t.size() % 3 == 1)t = "00" + t;
		else if (t.size() % 3 == 2)t = "0" + t;
		for (int i = 0; i < t.size(); i+=3) {
			ans = ans + mp2[t.substr(i, 3)];//提取字符
		}
		bool flag = false;
		for (int i = 0; i < ans.size(); i++) {
			if (ans[i] == '0' && !flag)continue;
			flag = true;
			printf("%c", ans[i]);
		}
		printf("\n");
		s.clear();
	}
	return 0;
}

一.string相关

string str(10,'a');
str.size();
str.length()//两个函数效果一样

substr 成员函数可以用于求子串 (n, m)

string s1,s2;
s2=s1.substr(2);//提取出str的下标为2到末尾,给str1
str1=str.substr(2,3);//提取出str的下标为2开始,提取三个字符,给str1

可直接用 ‘+’来拼接字符串。

二.思路波动过程

题做的太少了,看了提示才做下来,没啥好说的。

需要注意的是二进制转八进制时,需要补位的问题,三位二进制对应一位八进制,即可用字符串大小模3来判断需补几位。
余1说明空缺两位,余2相反,我给搞混了,这里要想深一点。

2020/2/17

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值