【蓝桥杯基础训练】十六进制转八进制

举报
昵称: 发表于 2022/02/21 16:06:16 2022/02/21
【摘要】 十六进制转八进制资源限制时间限制:1.0s   内存限制:512.0MB问题描述  给定n个十六进制正整数,输出它们对应的八进制数。输入格式  输入的第一行为一个正整数n (1<=n<=10)。  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。输出格式  输出n行,每行为输入对应的八进制正整数。  【注意】  输入...

十六进制转八进制

资源限制
时间限制:1.0s   内存限制:512.0MB
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

分析:根据提示我们可以将十六进制数字转换为二进制然后在转换为八进制,我们不使用系统提供的函数(Integer内置函数)来转换因为费内存无法在给定条件内计算出来。我们可以使用StringBuffer函数来保存转换后的函数;可以使用它的.append()方式进行追加,insert()进行插入;下面我们看代码:

import java.util.Scanner;

public class Main {

	 public static void main(String[] args) {
		 //赋值的过程
	        Scanner sc=new Scanner(System.in);
	        int i=sc.nextInt();
	        String[] arr=new String[i];
	        for (int j = 0; j < i; j++) {
				arr[j]=sc.next();
			}
    //转化为二进制
	        for (int j = 0; j < arr.length; j++) {
	        	//存放转换为二进制
	        	StringBuffer s=new StringBuffer();
	        	//对每一位进行判断
           for (int k = 0; k < arr[j].length(); k++) {
	       switch(arr[j].charAt(k)) {
	       case '0':
	    	   s.append("0000");
	    	   break;
	       case '1':
	    	   s.append("0001");
	    	   break;
	       case '2':
	    	   s.append("0010");
	    	   break;
	       case '3':
	    	   s.append("0011");
	    	   break;
	       case '4':
	    	   s.append("0100");
	    	   break;
	       case '5':
	    	   s.append("0101");
	    	   break;
	       case '6':
	    	   s.append("0110");
	    	   break;
	       case '7':
	    	   s.append("0111");
	    	   break;
	       case '8':
	    	   s.append("1000");
	    	   break;
	       case '9':
	    	   s.append("1001");
	    	   break;
	       case 'A':
	    	   s.append("1010");
	    	   break;
	       case 'B':
	    	   s.append("1011");
	    	   break;
	       case 'C':
	    	   s.append("1100");
	    	   break;
	       case 'D':
	    	   s.append("1101");
	    	   break;
	       case 'E':
	    	   s.append("1110");
	    	   break;
	       case 'F':
	    	   s.append("1111");
	    	   break;
	       }
} 
        //保证正好是3的倍数位,用来转换为八进制 4 2 1
           String s1="";
           while(s.length()%3!=0) {
        	   s=s.insert(0, "0");
           }
           s1=s.toString();
           //用来存放转换为八进制后的值
           StringBuffer sb=new StringBuffer();
           //进行对字符出遍历
           for (int k = 0; k < s1.length(); k+=3) {
        	   //每三位进行一次判断
        	   //因为转换为二进制只有0或者1所以用这个方法转换八进制
               //每三位二进制进行转换八进制
			int s2=(s1.charAt(k)-48)*4+(s1.charAt(k+1)-48)*2+(s1.charAt(k+2)-48)*1;
			//对边界值进行判断
			if(k!=0||k==0&&s2!=0) {
				sb.append(s2);
			}
		}
           //输出字符串
           System.out.println(sb);
           
			}
}
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。