蓝桥杯练习题--16进制转8进制

这题刚开始的时候我直接转化,用整形输出结果错了,即使是longlong也过不了,结果发现这道题得用字符串来输出。
因为我c++才刚学,所以在找题解找资料的过程中也学到了很多东西,感觉很赚,哼哼!
然后就打算写个题解来记录一下自己学到的东西。

 

 

问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

  【注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

 

AC代码:

#include<bits/stdc++.h> 
using namespace std;
int main()
{
	int n;
	string sixth[11];
	cin>>n;
	cin.ignore();
	for(int i;i<n;i++)
		getline(cin,sixth[i]);
	string Hexs[16]={"0","1","2","3","4","5","6","7",
					"8","9","A","B","C","D","E","F"};
	string Bins[16]={"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", 
			           "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
	string Octs[8] = {"0", "1", "2", "3", "4", "5", "6", "7"};
	for(int i=0;i<n;i++)
	{
		string Bin_num;
		int len=sixth[i].size();
		for(int j=0;j<len;j++)
		{
			char x=sixth[i].at(j);
			string Bin;
			if(x>='A'&&x<='F'){
				Bin=Bins[x-'A'+10];
			}
			else Bin=Bins[x-'0'];
			Bin_num.append(Bin);
		}
		len=Bin_num.size();
		if(len%3==1){
			Bin_num="00"+Bin_num;
		}
		if(len%3==2){
			Bin_num="0"+Bin_num;
		}
		len=Bin_num.size();
		string Oct_num;
		for(int k=0;k<len;k+=3)
		{
			string a=Bin_num.substr(k,3);
			int  m =2;
			int sum=0;
			for(int i=0;m>=0;m--,i++)
				sum+=pow(2.0,m)*(a[i]-'0');
			char c_sum[2];
			itoa(sum,c_sum,10);
			Oct_num.append(c_sum);
		}
		if(Oct_num[0]=='0')
			Oct_num.erase(Oct_num.begin());
		cout<<Oct_num<<endl;
	}
} 

整体思路:

先把16进制用字符串的形式输入,然后根据2进制表,开一个新的字符串数组Bin_num,用append依次追加16进制数每一位转化成2进制的结果,然后用substr三个三个的截取Bin_num中的二进制字符串,在转换成8进制,最后去除前导0(一开始我一直想不通为什么只去除开头的一个0,结果想了想发现最多也只有一个前导0)。

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值