蓝桥杯练习basic12

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

/*十六进制转二进制,二进制转八进制 
##############遇到的坑############################ 
1.要转换为二进制来做!100000位的十六进制!太大了!
2.字符串后添加字符   可以 s = s +'a' 不可以 s += 'a'
3.string.append(string)  传入参数不能是char,只能是string 
4.动态定义数组 
	string *ss = new string[n]; 
	delete[] ss; 
 */ 
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;

string string_to8(string s)//s为待转3/2/1位二进制字符串 
{
	if(s == "00" || s == "0")
		return "";
	if(s =="000")
		return "0";
	if(s == "1" || s == "01" || s == "001")
		return "1";
	if(s == "10" || s == "010")
		return "2";
	if(s == "11" || s == "011")
		return "3";
	if(s == "100")
		return "4";
	if(s == "101")
		return "5";
	if(s == "110")
		return "6";
	if(s == "111")
		return "7";
}
	
string char_to2(char a)//将十六进制字符转换成二进制数字 
{
	switch(a)
	{
		case '0':return "0000";
		case '1':return "0001";
		case '2':return "0010";
		case '3':return "0011";
		case '4':return "0100";
		case '5':return "0101";
		case '6':return "0110";
		case '7':return "0111";
		case '8':return "1000";
		case '9':return "1001";
		case 'A':return "1010";
		case 'B':return "1011";
		case 'C':return "1100";
		case 'D':return "1101";
		case 'E':return "1110";
		case 'F':return "1111";
	}
}

int main()
{
	int n;
	string s,binary,temp,res;
	cin>>n;
	while(n != 0)
	{
		int bit = 0;
		temp = res = binary = "";
		cin>>s;
		//cout<<s.length()<<"changdu"<<endl;
		for(int i=0;i<s.length();i++)
			binary += char_to2(s[i]);
		//cout<<binary<<endl;
		
		for(int j=binary.length()-1;j>-1;j--)
		{
			temp = temp + binary[j];
			bit++;
			if(bit % 3 == 0)
			{
				reverse(temp.begin(),temp.end());
				//cout<<"temp = "<<temp<<endl;
				res.append(string_to8(temp));
				//cout<<res<<endl;
				bit = 0;
				temp = "";
			 } 
			 else if(bit % 3 != 0 && j == 0)
			 {
			 	reverse(temp.begin(),temp.end());
				//cout<<"temp = "<<temp<<endl;
				res.append(string_to8(temp));
				//cout<<res<<endl;
				bit = 0;
				temp = "";
			 }
			 else
			 	continue;
		}
		reverse(res.begin(),res.end()); 
		for(int k = 0;k<res.length();k++)
		{
			if(k == 0 && res[k] == '0')
				continue;
			else
				cout<<res[k];
		}
		cout<<endl;
		n--;
	}
	
	return 0;
 } 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值