蓝桥杯 基础练习 十六进制转八进制

 基础练习 十六进制转八进制  
时间限制:1.0s   内存限制:512.0MB
      

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

  提示
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

分析:手动

十六进制二进制八进制标准输出(无前导)
39000 111 001(补零)07171
104000 100 000 1000404404
//整体思路十六进制转换为为二进制再转化为八进制
#include<iostream>
#include<cstring>
using namespace std; 
int main()
{
	int n,d,h;//h标记 
	cin>>n;
	while(n--)
	{
		string str,s;
		cin>>str;
		int h=0;
            //循环内是把十六进制转换为二进制,暴力
			for(int i=0;i<str.length();i++)
		{
			
			if(str[i]=='0')
				s+="0000";
			else if(str[i]=='1')
				s+="0001";
			else if(str[i]=='2')
				s+="0010";
			else if(str[i]=='3')
				s+="0011";
			else if(str[i]=='4')
				s+="0100";
			else if(str[i]=='5')
				s+="0101";
			else if(str[i]=='6')
				s+="0110";
			else if(str[i]=='7')
				s+="0111";
			else if(str[i]=='8')
				s+="1000";
			else if(str[i]=='9')
				s+="1001";
			else if(str[i]=='A')
				s+="1010";
			else if(str[i]=='B')
				s+="1011";
			else if(str[i]=='C')
				s+="1100";
			else if(str[i]=='D')
				s+="1101";
			else if(str[i]=='E')
				s+="1110";
			else if(str[i]=='F')
				s+="1111";
		}//得到二进制数 
		//方便得到的二进制数分为每组三个数字,进而转化为八进制,三位并一位 
		if(s.length()%3==1)//余数为1加2颗0  "00" 
		{
			s="00"+s;//"+"是连接符号,不能写成s+"00",有顺序,0要加在前面
		}
		else if(s.length()%3==2)
		{
			s="0"+s;
		}
        //预处理完毕后,进行转化i+=3
		for(int i=0;i<s.length();i+=3) 
		{
			d=0;//三位并一位,一位每次循环清零 ,前导控制 
            //i i+1 i+2三位,二进制转化为八进制,指数相乘,注意此处为字符,减去0字符的ASCII码
			d=4*(s[i]-'0')+2*(s[i+1]-'0')+(s[i+2]-'0');
			if(d)//控制不输出前导,由于只判断第一位,所以标记位h只使用一次,不在循环内更新 
			{
				h=1;//如果不为0,标记h=1,输出 
			} 
			if(h)
			cout<<d;//每三位一处理,一输出 
		}
		cout<<endl; 
	}
	return 0;
}  
java(运行超时 代码在编译器通过,但提交超时 )
 
import java.util.*;
import java.math.*;

public class Main {

	public static void main(String[] args) {
			int d;//h标记 
			Scanner input=new Scanner(System.in);
			int n=input.nextInt();
			while(n--!=0)
			{
				String s="";//字符串初始化
				String str1=input.next();
				char []str=str1.toCharArray();
				int h=0;
					for(int i=0;i<str1.length();i++)
				{
					
					if(str[i]=='0')
						s+="0000";
					else if(str[i]=='1')
						s+="0001";
					else if(str[i]=='2')
						s+="0010";
					else if(str[i]=='3')
						s+="0011";
					else if(str[i]=='4')
						s+="0100";
					else if(str[i]=='5')
						s+="0101";
					else if(str[i]=='6')
						s+="0110";
					else if(str[i]=='7')
						s+="0111";
					else if(str[i]=='8')
						s+="1000";
					else if(str[i]=='9')
						s+="1001";
					else if(str[i]=='A')
						s+="1010";
					else if(str[i]=='B')
						s+="1011";
					else if(str[i]=='C')
						s+="1100";
					else if(str[i]=='D')
						s+="1101";
					else if(str[i]=='E')
						s+="1110";
					else if(str[i]=='F')
						s+="1111";
				}//得到二进制数 
				//方便得到的二进制数分为每组三个数字,进而转化为八进制,三位并一位 
				if(s.length()%3==1)//余数为1加2颗0  "00" 
				{
					s="00"+s;//"+"是连接符号,不能写成s+"00",有顺序 
				}
				else if(s.length()%3==2)
				{
					s="0"+s;
				}
				char []s1=s.toCharArray();//把字符串s转化为字符数组存在s1[]数组
				for(int i=0;i<s.length();i+=3) 
				{
					d=0;//三位并一位,一位每次循环清零 
					d=(int)(4*(s1[i]-'0')+2*(s1[i+1]-'0')+(s1[i+2]-'0'));
					//c++与java区别 java需要强制类型转化
					if(d!=0)//控制不输出前导 
					{
						h=1;//如果不为0,标记h=1,输出 
					} 
					if(h==1)
						System.out.print(d);
				}
				System.out.println(); 
			}
	}
}






 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clark-dj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值